🤔 나의 풀이
📌 문제
- 파이썬 알고리즘 인터뷰 3번 문제
- leetcode 937번 - 로그 파일 재정렬
⊙ log의 가장 앞 부분은 식별자이다.
⊙ 문자로 구성된 log가 숫자 log보다 앞에 오도록 정렬된다.
⊙ 식별자는 순서에 영향을 끼치지 않는다. 그러나, 문자가 동일하면 식별자 순으로 한다.
⊙ 숫자 로그는 입력 순서대로 정렬된다.
📌 날짜
2020.01.15
📌 시도 횟수
5 try (마지막에는 결국 책의 힌트를 좀 참고해서 풀었다...)
💡 Code
class Solution:
def reorderLogFiles(self, logs: List[str]) -> List[str]:
digit, letter = [], []
for x in logs:
if x.split()[1].isdigit():
digit.append(x)
else:
letter.append(x)
return (sorted(letter, key=lambda x: (x.split(" ")[1:], x.split(" ")[0])) + digit)
💡 문제 해결 방법
⊙ 람다와 sorted를 이용하여 해결할 수 있다.
1. 우선 숫자는 따로 digit이라는 list에 입력 순서대로 append 한다.
*숫자는 isdigit()으로 판별할 수 있다.
2. 문자열은 letter이라는 list에 담는다.
3. 문자열을 우선 문자열(x.split()[1:])을 기준으로 정렬한다. - key1
4. 문자열이 같으면 식별자(x.split()[0])를 기준으로 정렬한다. - key2
*2개의 키를 람다 표현식을 정렬한다. - sorted(letter, key = lambda x: (key1, key2))
💡 새롭게 알게 된 점
- x.split(" ", N) : x를 " "을 기준으로 자르고, 그 중 처음부터 N개의 문자열만 반환한다.
- 2개의 키를 람다 표현식으로 정렬하는 문법을 알게 되었다.
⊙ 예시 : s.sort(key = lambda x : (x.split()[1], x.split()[0]))
- list는 + 연산자를 통한 연산이 가능하다.
- return list1 + list2 → 자동적으로 두 리스트가 차례대로 이어진 list가 반환이 된다.
❌ (한번에 맞추지 못한 경우) 오답의 원인
오답 코드
class Solution:
def reorderLogFiles(self, logs: List[str]) -> List[str]:
digit, letter = [], []
for x in logs:
if x.split()[1].isdigit():
digit.append(x)
else:
letter.append(x)
return sorted(letter, key=lambda x: x.split()[1]) + digit
원인 1. 문제를 제대로 이해하지 못했다. (솔직히 문제가 좀 불친절...ㅠㅠ)
- 조건 중 "문자가 동일할 경우 식별자 순으로 한다"를 완벽하게 고려하지 못했다.
- 위의 조건을 쉽게 풀어서 이해해보면 다음과 같다.
-----------------------------------------------------------------
⊙ 우선적으로는 식별자를 제외한 나머지 문자열을 기준으로 정렬한다.
⊙ 단, 나머지 문자열이 동일할 경우 후순위로 식별자를 이용하여 정렬한다.
-----------------------------------------------------------------
원인 2. sorted 함수에서 여러 개의 key로 정렬이 가능함을 몰랐다!
- sorted의 키를 (key1, key2)와 같이 2개로 설정할 수 있었다.
- 이때는 우선적으로 key1의 조건으로 sort하고, 후순위로 key2 조건을 사용한다.