20210. 파일 탐색기
- 풀이
- cmp_to_key
- Python 표준 라이브러리에 포함된 함수
- cmp_to_key는 두 값을 비교하는 함수를, key에 사용할 수 있는 함수 객체로 변환
- 정렬이 필요할때, 정렬을 하려는 두 수가 비교함수의 비교 규칙을 따라 정렬됨
sorted()함수에서 -> key: 정렬에 사용될 변환된 값을 반환하는 함수
cmp_to_key는 두 값을 비교하는 함수(옛날 스타일의cmp함수)를, key에 사용할 수 있는 함수 객체로 변환
cmp_to_key()의 매개변수 -> 비교함수
정렬 기준을 정의하며, 두 개의 값을 비교하여 다음 중 하나를 반환
양수: 첫 번째 값이 두 번째 값보다 클 때
0: 두 값이 같을 때
음수: 첫 번째 값이 두 번째 값보다 작을 때
- (a > b) - (a < b)의 의미
- 두 값을 비교할 때 대소 관계를 간결히 표현
- if-elif-else 조건문을 줄이는 데 사용
Python에서 True는 1, False는 0
(a > b)와 (a < b) 둘 중에 하나는 1, 하나는 0
결과
(a > b) - (a < b)
는 아래와 같은 값을 반환:
1 → a> b
-1 → a < b
0 → a == b
# 일반 조건문
if a > b:
return 1
elif a < b:
return -1
else:
return 0
# (a > b) - (a < b) 방식
return (a > b) - (a < b)
- 코드
- (int(a) > int(b)) - (int(a) < int(b)) or (len(a) > len(b)) - (len(a) < len(b))
- 두번째 비교문은 첫번째 비교문이 0일때만 실행(숫자 값이 같을 때)
- 반환 값:
- 1: a의 길이가 더 길다 (앞에 더 많은 0이 있다).
- -1: b의 길이가 더 길다.
- 0: 길이도 같다.
- => -1이 나오면 뒤의 값이 짧기때문에 먼저 앞순서로 정렬됨
import sys
from functools import cmp_to_key
def parse(s):
res, i = [], 0
while i < len(s):
if s[i].isalpha():
res.append(s[i])
i += 1
else:
num = ''
while i < len(s) and s[i].isdigit():
num += s[i]
i += 1
res.append(num)
return res
def natural_sort(s1, s2):
p1, p2 = parse(s1), parse(s2)
for a, b in zip(p1, p2):
if a == b:
continue
if a.isdigit() and b.isalpha():
return -1
if a.isalpha() and b.isdigit():
return 1
if a.isalpha() and b.isalpha():
return (a.lower() > b.lower()) - (a.lower() < b.lower()) or (a > b) - (a < b)
if a.isdigit() and b.isdigit():
return (int(a) > int(b)) - (int(a) < int(b)) or (len(a) > len(b)) - (len(a) < len(b))
return len(p1) - len(p2)
lst = [input().strip() for _ in range(int(input()))]
sorted_lst = sorted(lst, key=cmp_to_key(natural_sort))
for item in sorted_lst:
print(item)