알고리즘

[python/leetcode] 937번 reorder log files 문제 풀이

grin-quokka 2023. 3. 3. 11:15

https://leetcode.com/problems/reorder-data-in-log-files

 

Reorder Data in Log Files - LeetCode

Can you solve this real interview question? Reorder Data in Log Files - You are given an array of logs. Each log is a space-delimited string of words, where the first word is the identifier. There are two types of logs: * Letter-logs: All words (except the

leetcode.com

 

 

요약 : 로그를 기준에 맞게 정렬하라

 

 

기본 로직은 다음과 같다.

  1. 문자 로그 먼저, 그 다음에 숫자 로그 순이기 때문에 문자 로그와 숫자 로그를 분리해서 저장한다
  2. 문자 로그는 내용과 제목(identifier) 기준으로 정렬한다
  3. 문자 로그 + 숫자 로그 순으로 리턴한다

 

 

구현한 코드는 아래와 같다.

def reorderLogFiles(logs):
    dig = []
    let = []

    # 문자 로그와 숫자 로그를 분리해서 저장한다
    for log in logs:
        if log.split(' ')[1].isdigit():
            dig.append(log)
        else:
            let.append(log)

    # 문자 로그 정렬 : 내용을 내림차순으로, 같으면 제목 숫자 기준으로
    let = sorted(let, key=lambda l: l.split(' ')[0])
    let = sorted(let, key=lambda l: l.split(' ')[1:])

    # 문자 로그, 숫자 로그 순으로 리턴
    return let + dig

 

 

먼저 문자 로그와 숫자 로그를 분리하는 방법으로

하나의 로그를 공백 기준으로 나눠서

1번째 인덱스의 요소가

숫자로 되어있는지(isdigit) 확인했다.

log.split(' ')[1].isdigit()

 

 

문자 로그는 2가지 기준으로 정렬해야한다.

  1. 내용을 기준으로 내림차순 정렬
  2. 내용이 같다면 제목(identifier)에 있는 숫자 기준으로 정렬

그래서 먼저 identifier 기준으로 정렬한 다음, 내용을 기준으로 정렬해줬다.

sorted는 원본을 바꾸지 않아서, 반환값을 let 리스트에 다시 할당해줬다.

 

 

마지막으로 리스트 두 개를 합쳐줘야했는데

파이썬에서는 단순히 + 를 써서 합쳐줄 수 있다.

    return let + dig

js였다면 concat 메소드나 rest 연산자를 썼을 것이다.

 

 

보완한다면…

  1. js와 다르게 파이썬은 split할 때 아무것도 넘겨주지 않아도 공백을 기준으로 나뉜다. 따라서 단순히 log.split()[1] 으로 작성해도 된다.
  2. 문자 로그를 두 가지 기준으로 정렬하기 위해 sorted를 2번 썼는데, 하나로 합칠 수 있었다. 
# 문자 로그 정렬 : 내용을 내림차순으로, 같으면 제목 숫자 기준으로
let = sorted(let, key=lambda l: l.split(' ')[0])
let = sorted(let, key=lambda l: l.split(' ')[1:])
    
# 두가지 기준으로 한번에 정렬    
let = sorted(let, key=lambda l: (l.split(' ')[1:], l.split(' ')[0]))

 

3. 원본 리스트를 수정하고 싶은 경우라서 sorted가 아니라 sort를 썼으면 더 간단했겠다.

# (기존 코드) 반환된걸 다시 할당
let = sorted(...)

# 원본을 바꿈, 반환값 없음
sort(...)