Programming/Coding Test

leetcode 937. Reorder Data in Log Files 리트코드 937. 로그 파일 재정렬 풀이

makeitworth 2021. 5. 6. 11:15

<파이썬 알고리즘 인터뷰> 책에서 다룬 리트코드 문제들을 풀이한 포스팅이다.

 

문제는 모두 리트코드에 출제된 문제들이며, 직접 풀었지만, 책에서 주는 힌트와 풀이 과정들을 참고한 경우가 많다.

이곳은  정리한 책에 나온 문제에 대한 목록과 해설을 정리한 공식 깃허브 페이지 이며, 

다음 포스팅은 내가 푼 <파이썬 알고리즘 인터뷰> 문제 풀이 목록을 정리해 놓았다.

 

문제

리트코드 로그파일 재정렬

 

입력: list (string)

출력: list (string)

 

문제 요약: string이 원소인 리스트를 받아 정렬만 해서 다시 리스트로 출력한다. 그런데, 정렬의 기준이 조금 달라서 그 기준에 맞춰 정렬해야 한다는 점이 포인트

생각 과정

일단 각 원소를 띄어쓰기를 기준으로 쪼개서 리스트로 만든 다음, 각 로그의 첫번째 부분은 식별자라고 해서 식별자와 나머지로 나눠보았다.

 

a, b = [], []
for i in log_lst:
    a.append(i[0])
    b.append(i[1:])
a,b

Out[48]:

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

 

근데, 어차피 출력할 때는 다시 식별자랑 같이 출력해야 해서 이렇게 나누면 안될 거 같아서, 먼저 문자로 구성된 로그는 무조건 앞에 온다고 하니 문자로만 구성된 로그/ 그렇지 않은 로그로 나누었다.

 

여기서 처음에는 예시에 나온대로, let 으로 시작되는 식별자는 문자 로그, dig으로 시작되는 식별자는 숫자 로그인 줄 알고,

let, dig = [], []
for log in logs :
    if "l" in log[0]:
        let.append(log)
    else:
        dig.append(log)

 

이렇게 짰으나, 나중에 답을 제출해서 wrong answer 뜬 것을 보니 식별자는 'a1, z47... ' 등으로 다양했다.

결국 로그에 숫자가 포함되어있는지를 확인해야 하고, 책을 참고해서 .isdigit()이라는 메서드를 썼다.

다른 블로그를 참고하니 , isdigit()은 말그대로 digit이냐를 물어보기 때문에, 소수나 음수는 False를 리턴한다고... 그래서 실수인지를 파악하려면, try: except:를 활용해, float(str)이 되면 True, 오류나면, False를 리턴하는 방식으로 해결했다.

 

정리하면,

1. 주어진 리스트의 원소들을 문자로 구성된 로그 (let)와 숫자로 구성된 로그(dig)로 분류하고,

2. 숫자는 그냥 입력순으로 정렬하면 된다고 하니 내버려두고, let 리스트만 정렬하고,

3. let 리스트는 1) 알파벳 순으로 2)식별자 순으로 다중 key로 정렬한 다음

4. 문자로 구성된 로그 먼저, 숫자로 구성된 로그 나중이니 let 리스트 + dig 리스트 하여 return 

 

풀이

내가 제출한 코드는 다음과 같다.

 

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

 

 

참고: 파이썬 공식 문서 <파이썬 HOWTO> 중 정렬 페이지