소소한 컴퓨터 이야기

로그 파일 재정렬

by Cori

문제

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

 

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

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

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

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

 

· 입출력 예

logs return
["dig1 8 1 5 1", "let1 art can", "dig2 3 6"] ["let1 art can", "dig1 8 1 5 1", "dig2 3 6"] 

풀이

1. 람다 함수와 + 연산자 이용

-> 이 문제는 정렬해야하는 문자 로그와 정렬하면 안되는 숫자 로그로 나누는 것이 핵심 포인트이다.

def reorderLogFiles(logs:list[str]) -> list[str]:
    letters, digits = [], []
    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

위 코드를 수행하면 digits에는 숫자로 변환 가능한 로그 ("dig1 8 1 8 1", "dig2 3 6")가, letters에는 문자 로그가 저장되며, 문자 로그를 정렬한 후 문자 로그와 숫자 로그를 합쳐서 리턴한다. 정렬할 때, key에 lambda 함수를 사용하여 식별자를 제외한 문자열 기준으로 최우선 정렬하고, 문자가 동일한 경우 식별자 기준으로 정렬하도록 해주었다.

 

내가 문제 이해를 잘 못 한 거인지도 모르겠지만, logs의 두 번째 값에 문자가 오고, 세 번째부터 숫자가 올 경우에는 위 코드가 안먹히지 않을까 .. ? 아니면 로그 파일 구성은 숫자 로그: [이름] 숫자, 문자 로그: [이름] 문자 .. 이와 같이 구성되어 있는 것인가 ? 이 부분은 아직 미스테리이다.


Info

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

-> isdigit() 함수를 사용하면, 문자열 타입의 문자가 숫자인지 여부를 판단할 수 있다. 

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

-> 정렬할 때 키 값으로 lambda 함수를 위와 같이 사용할 수 있고, 정렬 기준을 두 개 이상 줄 경우 '()'를 통해 묶어준다.

'CS > Coding Test' 카테고리의 다른 글

전화번호 목록  (0) 2021.09.29
가장 흔한 단어  (0) 2021.09.29
타겟 넘버  (0) 2021.09.27
바이러스  (0) 2021.09.27
DFS와 BFS  (0) 2021.09.27

블로그의 정보

코딩하는 오리

Cori

활동하기