문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/17686
문제 설명
무지는 파일명에 포함된 숫자를 반영한 정렬 기능을 구현하기로 했다.
소스 파일 저장소에 저장된 파일명은 100 글자 이내로, 영문 대소문자, 숫자, 공백(" "), 마침표("."), 빼기 부호("-")만으로 이루어져 있다. 파일명은 영문자로 시작하며, 숫자를 하나 이상 포함하고 있다.
파일명은 크게 HEAD, NUMBER, TAIL의 세 부분으로 구성된다.
- HEAD는 숫자가 아닌 문자로 이루어져 있으며, 최소한 한 글자 이상이다.
- NUMBER는 한 글자에서 최대 다섯 글자 사이의 연속된 숫자로 이루어져 있으며, 앞쪽에 0이 올 수 있다. 0 부터 99999 사이의 숫자로, 00000 이나 0101 등도 가능하다.
- TAIL은 그 나머지 부분으로, 여기에는 숫자가 다시 나타날 수도 있으며, 아무 글자도 없을 수 있다.
파일명 | HEAD | NUMBER | TAIL |
foo9.txt | foo | 9 | .txt |
foo010bar020.zip | foo | 010 | bar020.zip |
F-15 | F- | 15 | (빈 문자열) |
파일명을 세 부분으로 나눈 후, 다음 기준에 따라 파일명을 정렬한다.
- 파일명은 우선 HEAD 부분을 기준으로 대소문자를 구별하지 않고 사전 순으로 정렬한다.
- 파일명의 우선 HEAD 부분이 대소문자 차이 외에는 같을 경우, NUMBER의 숫자 순으로 정렬한다. 숫자 앞의 0은 무시되며, 012와 12는 정렬 시에 같은 값으로 처리된다.
- 두 파일의 HEAD 부분과, NUMBER의 숫자도 같을 경우, 원래 입력에 주어진 순서를 유지한다.
입력 형식
입력으로 배열 files 가 주어진다.
- files는 1000 개 이하의 파일명을 포함하는 문자열 배열이다.
- 파일명은 영문자로 시작하며, 숫자를 하나 이상 포함하고 있다.
- 중복된 파일명은 없으나, 대소문자나 숫자 앞부분의 0 차이가 있는 경우는 함께 주어질 수 있다.
출력 형식
위 기준에 따라 정렬된 배열을 출력한다.
❌ Code - 실패
def solution(files):
answer = []
file_lst = []
for file in files:
head, number, tail = '', '', ''
number_tail = ''
# head와 나머지 분리
for i in range(len(file)):
if file[i].isdigit():
head = file[:i]
number_tail = file[i:]
break
# number와 tail 분리
for i in range(len(number_tail)):
if not number_tail[i].isdigit():
number = number_tail[:i]
tail = number_tail[i:]
break
file_lst.append([head, number, tail])
file_lst.sort(key=lambda x: (x[0].lower(), int(x[1])))
for f in file_lst:
answer.append(''.join(f))
return answer
위와 같이 분리할 경우, 만약 입력이 "A12345"가 주어질 때, number와 tail을 분리하는 과정에서 조건문에 걸리지 않아, number가 빈 문자열이 되므로, 정렬할 때 에러가 나게 된다.
이것을 고려하여, head와 나머지를 분리할 때, 나머지를 number 변수에 넣어 에러를 해결했다.
✅ Code - 성공
def solution(files):
answer = []
file_lst = []
for file in files:
head, number, tail = '', '', ''
# head와 나머지 분리
for i in range(len(file)):
if file[i].isdigit():
head = file[:i]
number = file[i:]
break
# number와 tail 분리
for i in range(len(number)):
if not number[i].isdigit():
tail = number[i:]
number = number[:i]
break
file_lst.append([head, number, tail])
file_lst.sort(key = lambda x : (x[0].lower(), int(x[1])))
for f in file_lst:
answer.append(''.join(f))
return answer
'알고리즘 문제 > 프로그래머스_Lv2 도장깨기' 카테고리의 다른 글
[프로그래머스] 전화번호 목록 (Python) (0) | 2024.03.18 |
---|---|
[프로그래머스] n진수 게임 (2) | 2024.02.28 |
[프로그래머스] 압축 (Python) (1) | 2024.01.30 |
[프로그래머스] 방금그곡 (Python) (1) | 2024.01.23 |
[프로그래머스] 캐시 (Python) (0) | 2024.01.22 |