03. Reorder Data in Log Files

eunseo kim 👩‍💻·2021년 1월 14일
1

🎯 leetcode - 937. Reorder Data in Log Files


🤔 나의 풀이

📌 문제

- 파이썬 알고리즘 인터뷰 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 부분이 틀렸다! ⚠ 
        return sorted(letter, key=lambda x: x.split()[1]) + digit
원인 1. 문제를 제대로 이해하지 못했다. (솔직히 문제가 좀 불친절...ㅠㅠ)
- 조건 중 "문자가 동일할 경우 식별자 순으로 한다"를 완벽하게 고려하지 못했다.
- 위의 조건을 쉽게 풀어서 이해해보면 다음과 같다. 
-----------------------------------------------------------------
  ⊙ 우선적으로는 식별자를 제외한 나머지 문자열을 기준으로 정렬한다.
  ⊙ 단, 나머지 문자열이 동일할 경우 후순위로 식별자를 이용하여 정렬한다.
-----------------------------------------------------------------

원인 2. sorted 함수에서 여러 개의 key로 정렬이 가능함을 몰랐다!
- sorted의 키를 (key1, key2)와 같이 2개로 설정할 수 있었다.
- 이때는 우선적으로 key1의 조건으로 sort하고, 후순위로 key2 조건을 사용한다.

profile
열심히💨 (알고리즘 블로그)

0개의 댓글