문제 보기 · 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단계 · 코드 흐름
  1. 파일명을 받아 (HEAD 소문자, NUMBER 정수)를 돌려주는 key 함수를 만든다.
  2. 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의 순서가 바뀐다.
검증: 문제의 예시 2개를 통과했고, 무작위 파일명 목록 2,000개에서 “한 글자씩 읽어 HEAD·NUMBER를 자르고, 같으면 원래 번호로 비교하는 비교 함수”로 정렬한 풀이와 결과가 같았다 — 06_pg17686_p1.py
  1. 프로그래머스 스쿨, “[3차] 파일명 정렬” (https://school.programmers.co.kr/learn/courses/30/lessons/17686), 2026-09-30 조회. ↩