문제 보기 · Level 2 · 2018 KAKAO BLIND RECRUITMENT (3차) · 정답률 60% · 푼 사람 16,181명 (2026-09-30 기준)1
문제
파일명을 HEAD(숫자가 아닌 앞부분), NUMBER(이어지는 숫자 1~5자리), TAIL(나머지)로 나눈다. HEAD를 대소문자 무시하고 사전순으로 정렬하고, HEAD가 같으면 NUMBER를 수 값으로 비교한다. 둘 다 같으면 입력 순서를 지킨다. 정렬한 파일명 배열을 돌려준다.
- 파일 최대 1,000개, 이름 최대 100자
- NUMBER 앞에 0이 올 수 있고, 012와 12는 같은 값이다
풀이
막히면 한 단계씩 펼친다.
필요한 개념
- 문자열 파싱과 정규 표현식: 파일명을 HEAD와 NUMBER로 자르기
- 정렬과 정렬 기준:
(HEAD 소문자, NUMBER 수 값)을 key로 정렬하기. 같으면 원래 순서를 지키는 안정 정렬 - 진법과 자릿수: 숫자 문자열의 값은 자리마다 10의 거듭제곱을 곱해 더한 것이라, 앞에 붙은 0은 값을 바꾸지 않는다. 글자 순 비교는 자릿수가 같을 때만 크기 순과 늘 맞는다
1단계 · 작은 예로 손으로 풀기
[“b2.txt”, “A10.txt”, “a2.png”, “a02.txt”]
| 파일 | HEAD (소문자) | NUMBER (수 값) |
|---|---|---|
| b2.txt | b | 2 |
| A10.txt | a | 10 |
| a2.png | a | 2 |
| a02.txt | a | 2 |
HEAD, 그다음 NUMBER 순으로 세운다. a2.png와 a02.txt는 둘 다 (a, 2)라서 입력 순서대로 a2.png가 먼저다.
답은 [“a2.png”, “a02.txt”, “A10.txt”, “b2.txt”]다.
2단계 · 가장 단순한 방법과 그 속도
파일이 1,000개라 정렬 한 번이면 된다(\(O(n \log n)\)). 이 문제의 일은 두 가지다. 파일명을 정확히 자르는 것, 그리고 정렬 기준을 정확히 세우는 것이다.
3단계 · 핵심 아이디어
- 자르기: 정규 표현식
(\D+)(\d{1,5})가 “숫자 아닌 글자 하나 이상, 그다음 숫자 1~5개”를 앞에서부터 찾는다.\D는 숫자가 아닌 글자(공백, 점, 빼기도 포함)다. 숫자가 6개 이상 이어지면 앞 5개만 NUMBER가 되고 나머지는 TAIL로 간다. - 기준: key를
(HEAD.lower(), int(NUMBER))튜플로 만든다. 튜플은 앞 칸부터 비교하니 “HEAD 먼저, 같으면 NUMBER”가 저절로 된다. - 같은 것끼리 순서: 파이썬 정렬은 안정 정렬이라 key가 같으면 입력 순서를 지킨다. TAIL은 기준에 넣지 않는다.
4단계 · 코드 흐름
- 파일명을 받아
(HEAD 소문자, NUMBER 정수)를 돌려주는 key 함수를 만든다. sorted(files, key=key함수)를 돌려준다.
5단계 · 파이썬 코드
import re
def solution(files):
def key(f):
head, number = re.match(r"(\D+)(\d{1,5})", f).groups()
return (head.lower(), int(number))
return sorted(files, key=key)
re.match(모양, f): f의 맨 앞부터 모양이 맞는지 본다. 맞으면 결과 묶음을 돌려준다..groups(): 괄호로 묶은 부분들을 튜플로 꺼낸다. 여기서는 (HEAD, NUMBER)다.int(number):"012"와"12"를 둘 다 12로 만든다.
6단계 · 실행 추적
[“img12.png”, “img10.png”, “img02.png”, “img1.png”, “IMG01.GIF”, “img2.JPG”]
| 파일 | key |
|---|---|
| img12.png | (img, 12) |
| img10.png | (img, 10) |
| img02.png | (img, 2) |
| img1.png | (img, 1) |
| IMG01.GIF | (img, 1) |
| img2.JPG | (img, 2) |
key 순으로, 같은 key는 입력 순서대로 → [“img1.png”, “IMG01.GIF”, “img02.png”, “img2.JPG”, “img10.png”, “img12.png”]
7단계 · 복잡도와 흔한 실수
key를 한 번씩 만들고 정렬하니 \(O(n \log n)\)이다(이름 길이는 100 이하).
- NUMBER를 문자열로 비교해 “10”이 “9”보다 앞에 온다.
- NUMBER를 숫자가 끝날 때까지 다 읽는다. 최대 5자리다.
- HEAD를 대소문자 그대로 비교한다.
- 안정 정렬이 아닌 방법(예: 직접 짠 불안정한 정렬)을 써서 같은 key의 순서가 바뀐다.
-
프로그래머스 스쿨, “[3차] 파일명 정렬” (https://school.programmers.co.kr/learn/courses/30/lessons/17686), 2026-09-30 조회. ↩