문제 확인
나의 풀이
- 파일명에서 HEAD, NUMBER, TAIL을 구분하기 위해서 GROUP을 활용했다.
필요 없는 0 제거하기
- int(문자열)을 사용하면, 앞에 있는 필요 없는 "0"을 자동으로 제거해준다.
- str.lstrip("0")을 활용할 경우, 숫자 "0"도 제거돼 오류가 발생한다.
GROUPS
- 해당 GROUP에 패턴을 찾지 못했다면, group[i] 빈칸을 가지고 있다.
- 찾지 못한 경우를 위해 예외처리를 하지 않아도 된다.
# 파일명에 포함된 숫자를 반영한 정렬 기능 구현
# 숫자 : 0 ~ 99999 -> 숫자 앞의 0은 무시
# 정렬 기준 : 1. HEAD 2.NUMBER 3. 입력 순으로
# NUMBER의 숫자와, Tail의 숫자 구분 필요
import re
def solution(files):
# (HEAD)(NUMBER)(TAIL) 분리
pt = r"([^\d]+)(\d+)(.*)"
# HEAD - NUMBER -TAIL 분리 후 새로운 파일명
file_splited = []
for file in files:
obj = re.search(pt, file)
file_splited.append([obj.group(1), obj.group(2), obj.group(3)])
# Number 부분 정렬할 때, int로 변경하지 않으면 10 > 2가 됨
# int : 앞의 0을 알아서 없애줌
# str.lstrip("0")은 "0"이 문제 번호인 경우 에러 발생
file_splited.sort(key = lambda x : (x[0].lower(), int(x[1])))
file_splited = ["".join(file) for file in file_splited]
return file_splited
다른 사람 풀이
lambda에 함수 전달
- lambda에 추가로 함수를 활용할 수 있다.
- 원래 lambda에 순서쌍이 오는거처럼, 함수가 순서쌍을 반환하면 된다.
import re
def solution(files):
def key_function(fn):
head,number,tail = re.match(r'([a-z-. ]+)(\d{,5})(.*)',fn).groups()
return [head,int(number)]
return sorted(files, key = lambda x: key_function(x.lower()))
Number → Head : 문제 조건 만족
import re
def solution(files):
a = sorted(files, key=lambda file : int(re.findall('\d+', file)[0]))
b = sorted(a, key=lambda file : re.split('\d+', file.lower())[0])
return b