이번 테스트는 어려웠다 ㅜㅜ
접근까지는 어떻게 했는데 정규표현식을 사용할 수가 없었다.
역시 프로그래머스 레벨 2 문제였다!
https://programmers.co.kr/learn/courses/30/lessons/17686?language=python3
무지는 단순한 문자 코드 순이 아닌, 파일명에 포함된 숫자를 반영한 정렬 기능을 저장소 관리 프로그램에 구현하기로 했다.
소스 파일 저장소에 저장된 파일명은 100 글자 이내로, 영문 대소문자, 숫자, 공백(" "), 마침표("."), 빼기 부호("-")만으로 이루어져 있다. 파일명은 영문자로 시작하며, 숫자를 하나 이상 포함하고 있다.
파일명은 크게 HEAD, NUMBER, TAIL의 세 부분으로 구성된다.
여기서 테일이 .확장자로 통일되기만 했어도 기본 정렬로 풀 수 있었는데 불행히도 아니었다.
숫자와 문자가 섞인 정렬의 경우 sort의 키값에 커스텀 함수를 사용해야 하고
파일 이름을 자료형에 따라 분리해야 하고 (HEAD, NUMBER, TAIL)
그 함수를 re 패키지를 써서 정규표현식으로 구현해야 한다까지는 알겠는데
이 예외 가득한 목록을 정규표현식을 사용해서 헤드 넘버 테일(테일은 필요없) 로 나누는게 감이 안왔다.
그래서 그냥 정답을 보고 정규표현식을 긁어왔다.
전체 코드
import re
def solution(files):
sp_by_number = []
file_list = []
for n in files:
sp_by_number.append(re.split(r'(\d+)', n))
# print(sp_by_number)
sp_by_number.sort(key = lambda x : (x[0].lower(), int(x[1])))
for i in sp_by_number:
file_list.append(''.join(i))
return file_list
분리된 넘버를 담아놓을 임시 리스트 하나
정답을 합쳐서 다시 제출할 파일리스트 하나!
먼저 정규표현식으로 반복문을 돌려서 헤드와 넘버와 테일을 분리해준 리스트를 리턴한다.
split 함수를 써서 숫자로 된 부분 전체를(문제에서 number는 적어도 섞이진 않는다고 했으니까)
구분자로 삼아 헤드와 테일도 리턴해준다.
그 리스트를 sort하는데 이때 키로는 람다함수를 써서
조건1 헤드[0]의 알파벳 소문자 정렬이랑 조건2 넘버[1]의 숫자 기준 정렬을 한줄에 입력해준다.
두번째 반복문에서는 파일리스트에 join 함수로 다시 잘 주워담아서 정답으로 리턴해준다!
정답 쓰신 분은 리턴에 리스트컴프리헨션을 적용하여 임시 리스트 없이 바로 프린트했다!