문제
https://school.programmers.co.kr/learn/courses/30/lessons/17686
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
입출력

해설
입력으로는 파일명들이 들어온다.
파일명을 Head, Number, Tail로 자를 수 있을 때, 정렬하여 리턴하는 문제이다.
일단 Head는 숫자를 제외한 숫자들의 집합이다.
Number는 문자를 제외하고 숫자만 1개에서 5개까지 갖고 있는 집합이고
마지막으로 Tail은 Number를 포함하지 않는 나머지 부분들이다.
이렇게 보면 하나의 파일명은 Number를 기준으로 자를 수 있게 된다.
그래서 파일명이 있을 때 숫자가 나오기 직전까지는 Head로 자르고,
그 이후 Number로 넣다가 최대 5개의 숫자까지 Number에 넣어준다.
나머지는 전부 Tail로 넣어주면 된다.
위에 있는 작업을 정규표현식을 이용하면 매우 편리하게 문제 풀이를 진행할 수 있다.
정규표현식을 '\d{1,5}'라고 정의를 해보자.
이랬을 시에 해석해보면 숫자들이 1개에서 5개까지있는 집합을 의미한다.
위와 같이 해당 정규표현식을 이용해서 Number의 구간 idx를 매우 편리하게 구할 수 있게 된다.
그럼 해당 [s, e]을 이용하여 파일의 [:s]은 Head가 되고, [s:e]은 Number가 되며, [e:]은 Tail이 된다.
그 이후 sort를 이용해서 정렬을 진행해주면 되는데,
정렬 조건을 잘 보면 Head를 기준으로 대소문자를 구별하지 않고 정렬해야 하므로 .lower()를 붙여줬다.
이후 Number를 기준으로 정렬하는데 정수표현일 때와 같이 정렬해야 되므로 int()를 감싸서 정렬해주었다.
마지막으로 Head, Number에 의해 정렬이 되지 않으면 초기의 위치를 기준으로 정렬해야 되므로 answer를 추가해줄 때 index를 추가적으로 맵핑해서 정렬할 수 있게끔 해주었다.
정답코드
'''
'25. 11. 1.(토)
1. 파일 이름 순
2. 정규표현식을 이용하면 쉽게 풀릴 것 같다.
head, number, tail로 자르는데.
head는 숫자가 아닌 최소 한글자 문자
처음부터
number 한글자에서 최대 다섯 글자의 연속된 숫자
tail은 그 나머지 부분.
'''
import re
def solution(files):
answer = []
pattern = re.compile('\d{1,5}')
for idx, word in enumerate(files):
p = pattern.search(word)
s, e = p.span()
answer.append([word[:s], word[s:e], word[e:], idx])
answer.sort(key=lambda x: (x[0].lower(), int(x[1]), x[3]))
for idx, word in enumerate(answer):
answer[idx] = word[0] + word[1] + word[2]
return answer
깃허브 : https://buly.kr/3NJdk9j
'코딩테스트 > programmers' 카테고리의 다른 글
| 프로그래머스 / 비트마스킹 / 2개 이하로 다른 비트 (0) | 2025.11.08 |
|---|---|
| 프로그래머스 / 구현 / [1차] 프렌즈4블록 (0) | 2025.11.02 |
| 프로그래머스 / DP / 2 * n 타일링 (0) | 2025.10.19 |
| 프로그래머스 / 구현 / 주차 요금 계산 (0) | 2025.10.18 |
| 프로그래머스 / DP / 숫자 변환하기 (0) | 2025.10.17 |