로그 파일 재정렬
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 함수를 위와 같이 사용할 수 있고, 정렬 기준을 두 개 이상 줄 경우 '()'를 통해 묶어준다.
블로그의 정보
코딩하는 오리
Cori