코딩테스트/LeetCode

[문자열 조작] 로그파일 재정렬

scone 2024. 5. 8. 10:49

🥕 [문자열 조작] 로그파일 재정렬

문제 링크

url : https://leetcode.com/problems/reorder-data-in-log-files/

 

🍒 문제 분석

로그 가장 앞부분은 식별자

문자로 구성된 로그가 숫자 로그보다 앞에 온다.

사전순으로 문자를 정렬한다.

문자가 동일한 경우, 식별자 순으로 정렬한다.

숫자 로그는 입력 순서대로 정렬한다.

 

🍓 내 해결 과정

숫자열과 문자열을 쪼갠 뒤, 문자열을 정렬한 뒤 합침

 

🥑 틀린 답안

class Solution:
    def reorderLogFiles(self, logs: List[str]) -> List[str]:
        let, dig = [], []
        for ls in logs:
            if ls.split()[1].isdigit():
                dig.append(ls)
            else:
                tmp = ls.split()[1:] + [ls.split()[0]]
                let.append(tmp)
        let.sort()
        let = [' '.join([ls[-1]]+ls[:-1]) for ls in let]
        return let + dig

 

Input
logs =
["dig1 8 1 5 1","let1 art zero can","dig2 3 6","let2 own kit dig","let3 art zero"]

Output
["let1 art zero can","let3 art zero","let2 own kit dig","dig1 8 1 5 1","dig2 3 6"]

Expected
["let3 art zero","let1 art zero can","let2 own kit dig","dig1 8 1 5 1","dig2 3 6"]

 

 

"art zero can"

"art zero"

 

위 둘을 정렬하면 "art zero", "art zero can" 순으로 오는 것이 맞다.

 

위 답안에서는 "art zero let3", "art zero can let1" 을 정렬하다보니 나온 오답인듯 하다.

 

 

🥑 람다 + 연산

# https://leetcode.com/problems/reorder-data-in-log-files/
class Solution:
    def reorderLogFiles(self, logs: List[str]) -> List[str]:
        let, dig = [], []
        for ls in logs:
            if ls.split()[1].isdigit():
                dig.append(ls)
            else:
                let.append(ls)
        let.sort(key=lambda x: (x.split()[1:], x.split()[0]))
        return let + dig

 

🍉 깨달은 점 및 정리

길이가 동적으로 들어있는 배열도 람다를 사용해서 저렇게 정렬할 수 있다는 것을 배웠다.