반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

멋진 개발자가 되고 싶다

[LeetCode] 937. 로그 파일 재정렬(Reorder Log Files) 본문

Algorithm Study/leetcode

[LeetCode] 937. 로그 파일 재정렬(Reorder Log Files)

오패산개구리 2021. 6. 25. 00:00
728x90
반응형

로그를 재 정렬한다. 기준은 다음과 같다.

1. 로그의 가장 앞부분은 식별자이다.

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

3. 식별자는 보통 순서에 관여하지는 않지만 문자가 동일한 경우 식별자 순으로 한다.

4. 숫자 로그는 입력된 순서대로 한다.

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

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

 

 

내가 푼 코드(답 힐끗 모드)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution:
    def reorderLogFiles(self, logs: List[str]) -> List[str]:
        alpha = list()
        numeric = list()
        # 알파벳 로그와 숫자 로그를 분리
        for i in range(len(logs)):
            string = ''.join((logs[i].split())[1:])
            if string.isalpha():
                alpha.append(logs[i])
            else:
                numeric.append(logs[i])
        #alpha 정렬
        alpha.sort(key=lambda x : (' '.join(x.split()[1:]),''.join(x.split()[0])))
 
        return alpha+numeric
cs

 

해설 :

제일 먼저 해야될 것은 문자 로그와 숫자 로그로 분리하는 것이다.

따라서 문자열에서 식별자를 분리한 것을 isalpha() 함수를 이용하였다.

그 후 13번 줄이 핵심인데 sort 함수에 key 값을 람다 표현식으로 넣는 것이다.

중괄호 내부에서 문자가 동일한 경우 식별자를 이용한 비교를 후 순위로 하도록 했다

(이 부분 도저히 생각이 안 나서 눈팅했음).

 

 

 

** 깔끔한 답지 **

 

1. 람다와 +연산자를 이용

1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
    def reorderLogFiles(self, logs: List[str]) -> List[str]:
        letters, digits = [], []
        for log in logs:
            if log.split()[1].isdigit():
                digits.append(log)
            else:
                letters.append(log)
 
        # 2개의 키를 람다 표현식으로 정렬
        letters.sort(key=lambda x : (x.split()[1:],x.split()[0]))
        return letters + digits
cs

 

해설 :

 

군더더기가 없다...

우선 line 4에서 logs를 저런 식으로 꺼내 쓸 수 있는 스킬도 염두해야 될 것 같다.

line 5에서 어차피 숫자 로그 전체를 isdigit()할 필요는 없고

하나만 숫자여도 로그 전체가 숫자일 테니 이런 식으로 간결하게 표현할 수 있다

(나는 split도 하고 join도 하고 너저분했음).

하이라이트는 line 11인데 문자 로그를 비교할 때 식별자는 제외하고 비교를 해야 하기 때문에

key를 사용하여 범위를 한정해준다.

후순위로 식별자로 비교를 해야 하므로 (1순위, 2순위)의 형식을 취한다.

마지막으로 리스트를 + 연산자를 이용하면 하나의 리스트로 합쳐지게 된다.

 

 

 

 

 

 

출처 : 파이썬 알고리즘 인터뷰 (글 : 박상길 그림 : 정진호) [책만]

728x90
반응형