[프로그래머스/Lv2] [3차] 파일명 정렬
https://school.programmers.co.kr/learn/courses/30/lessons/17686
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
import re
def solution(files):
def init_dict(files):
r = r'([0-9]+)'
file_dict = {}
for file in files:
split_file = re.split(r, file)
file_dict[file] = {
'HEAD': split_file[0].lower(),
'NUMBER': int(split_file[1]),
'TAIL': split_file[2]
}
return file_dict
file_dict = init_dict(files)
sorted_file = dict(sorted(file_dict.items(), key=lambda x:(x[1]['HEAD'], x[1]['NUMBER'])))
return list(sorted_file.keys())
설명
문제를 차근차근 읽고 구현해야할 기능이 무엇인지 잘 생각해보면,
1. 파일명을 HEAD, NUMBER, TAIL로 나누기
2. 주어진 조건대로 파일 정렬하기
로 정리된다.
import re
def init_dict(files):
r = r'([0-9]+)'
file_dict = {}
for file in files:
split_file = re.split(r, file)
file_dict[file] = {
'HEAD': split_file[0].lower(),
'NUMBER': int(split_file[1]),
'TAIL': split_file[2]
}
return file_dict
init_dict는 파일명을 HEAD, NUMBER, TAIL로 나눠 딕셔너리에 기록한 뒤, 그 딕셔너리를 반환하는 함수이다.
정규표현식으로 숫자가 연속으로 등장하는 부분을 기준으로 나눠줄 것이다.
나눠진 리스트의 첫번째 원소를 HEAD로, 두번째 원소를 NUMBER로, 나머지를 TAIL로 기록한다.
file_dict는 각 파일명에 해당하는 HEAD, NUMBER, TAIL을 기록할 딕셔너리이다.
files의 원소(file)를 하나씩 꺼내며 반복한다.
미리 지정해둔 정규 표현식 r을 기준으로 file을 split하여 split_file 변수에 저장한다.
file_dict에 file키를 가지는 값을 기록할 것인데, 기록하는 값 또한 딕셔너리로 처리한다.
split_file의 첫번째 원소를 소문자변환하여 HEAD 키에 기록하고, split_file의 두번째 원소를 int형변환하여 NUMBER 키에 기록한다.
나머지 부분은 TAIL 키에 기록한다.
첫번째 원소를 소문자변환하는 이유는 문제에서 주어진 대로 HEAD의 문자열 비교는 대소문자 구분하지 않기 위해서이다.
두번째 원소를 int형변환하는 이유는 파일에 포함된 숫자가 숫자 순으로 정렬되기 위해서이다(문자열을 기준으로 정렬하면 사전순으로 정렬됨).
세번째 원소를 split_file의 두번째 원소로 지정해도 상관없는 이유는 어차피 정렬에서 TAIL은 사용되지 않기 때문이다.
정확하게는 split_file[2:]가 의도한 대로 동작하는 코드이다.
file_dict = init_dict(files)
만들어둔 init_dict 함수에 files를 매개변수로 주어 반환된 딕셔너리를 file_dict에 저장한다.
sorted_file = dict(sorted(file_dict.items(), key=lambda x:(x[1]['HEAD'], x[1]['NUMBER'])))
딕셔너리를 HEAD와 NUMBER를 기준으로 정렬한다.
정렬하고 나온 값은 다시 dict로 형변환하여 sorted_file에 저장한다.
return list(sorted_file.keys())
sorted_file.keys()를 list로 형변환하여 반환한다.
'코딩테스트 > 연습문제' 카테고리의 다른 글
[프로그래머스/Lv2] 모음사전 (0) | 2022.11.22 |
---|---|
[프로그래머스/Lv2] 연속 부분 수열 합의 개수 (0) | 2022.11.21 |
[프로그래머스/Lv2] 방문 길이 (0) | 2022.11.17 |
[프로그래머스/Lv2] 땅따먹기 (0) | 2022.11.16 |
[프로그래머스/Lv2] 스킬트리 (0) | 2022.11.15 |