코딩 테스트/파이썬 알고리즘 인터뷰

Python 알고리즘 인터뷰 - 문제3 로그파일 재정렬

스마트코더91 2024. 1. 18. 09:07

leetcode 937. Reorder Log Files

 

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

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

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

3. 문자 로그는 식별자 다음의 문자들 순서대로 정렬 한다.

4. 식별자는 순서에 영향을 끼치지 않지만, 문자가 동일할 겨우 식별자 순으로 한다.

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

 

예제

[예제1]

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

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

 

풀이

문자와 숫자 로그를 서로 분리해야한다. 숫자 로그는 log.split()[1].isdigit()인 경우에 숫자 리스트에 추가하며 나머지는 문자 리스트에 추가한다.

digits, letters = [], []
for log in logs:
	if log.split()[1].isdigit():
    	digits.append(log)
    else:
    	letters.append(log)

문자 리스트 정렬은 조건3. -> 조건4. 순서로 정렬되어야 한다. 먼저 조건3. 은식별자를 제외한 나머지 문자열을 기준으로 정렬을 해야하는데 문자열 letter = 'let1 own kit dig' 일 때 letter를 split하면 ['let1', 'own', 'kit', 'dig']가 된다. 해당 리스트를 [1:]으로 슬라이싱하면 ['own', 'kit', 'dig'] 리스트가 되며, 이를 기준으로 정렬을 한다. 이를 줄이면 letter.split()[1:]을 기준으로 정렬을 한다.

조건4. 는 letter의 첫번째 문자열 letter.split()[0]를 기준으로 정렬을 한다. 

위의 정렬을 기준으로 sort함수의 key로 lambda를 작성하여 정렬한다.

letters.sort(key = lambda x: (x.split()[1:], x.split()[0]))

 

 숫자 로그는 입력순서대로 정렬을 진행하므로 letters + digits를 통해 리스트를 연결한 후 반환한다.

return letters + digits

 

코드

digits, letters = [], []

for log in logs:
    if log.split()[1].isdigit():
        digits.append(log)
    else:
        letters.append(log)

letters.sort(key = lambda x:(x.split()[1:], x.split()[0]))

return letters + digits