코딩테스트/BOJ

[백준][구현] 20210. 파일 탐색기

박소민 2024. 11. 18. 14:25
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)

 

'코딩테스트 > BOJ' 카테고리의 다른 글

[백준][DFS] 2668.숫자고르기  (0) 2025.01.21
[백준][부분합] 2632. 피자판매  (0) 2024.12.12
[백준][DP] 2293. 동전 1  (0) 2024.10.22
[백준][DP] 5569. 출근 경로  (0) 2024.10.11
[백준][DP] 12865. 평범한 배낭  (2) 2024.10.11