- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/17686
Lv2. 문제이다!
생각보다 쉽지 않았던 문제다.
문제 이해
1. Head, Number, Tail을 조건에 맞춰서 분리한다
문자를 탐색하다가 최초로 숫자가 나오면 그 전까지는 무조건 Head이다.(Head는 앞에 위치하고, 문자로만 이루어져있기 때문이다) Head를 제외한 부분부터 숫자가 나오는 구간은 모두 Number로 하고, 그 외의 문자가 나올 때부터 끝까지는 모두 Tail로 지정한다
2. 우선 순위대로 파일명을 정렬해서 출력한다
2-1. Head(문자)는 사전 순으로 정렬(대소문자 구분하지 않음)
2-2. Number는 01과 1을 같게 정렬한다(숫자 앞의 0은 무시한다)
2-3. Head와 Number가 같다면 원래 입력에 주어진 순서를 유지한다(중복된 파일명에 대해서는 입력된 순서대로 출력한다) 이거는 따로 고려할 필요가 없다. 왜냐하면 파이썬에서 제공하는 sort()함수는 stable 정렬이기 때문이다
(stable은 중복된 값을 입력된 순서와 동일하게 정렬한다)
어려웠던 점
1. Head는 대소문자 구분없이 정렬해야하는데 막상 Head.sort()를 하면 대소문자가 구분되어서 정렬된다. 그렇다고 Head의 모든 값을 lower()를 이용해 소문자로 만들면 또 원상복귀를 해야하고,, 그래서 이부분을 어떻게 해야할지 몰랐다
2. 01과 1을 같게 구분해야하는데 이부분도 sort()로는 잘되지 않았다
위의 문제를 해결할 코드는 다음과 같다
result = sorted(result, key = lambda x : (x[0].lower(), int(x[1])))
3. 그리고 0인덱스는 head, 1인덱스는 number, 2인덱스는 tail로 생각하고 로직을 처음에 작성했지만 이렇게 하면 파일명이 중복될 수 있다. 따라서 head, number, tail에 해당하는 문자열을 명확히 지정해줘야한다
- 정답 풀이 :
파일명이 중복으로 추가되지 않게 하기 위해 for문에서 두번째 break를 설정해준다
def solution(files):
result = []
head, number, tail = '', '', ''
for file in files:
for i in range(len(file)):
if file[i].isdigit():
head = file[: i]
number = file[i:]
for j in range(len(number)):
if not number[j].isdigit():
tail = number[j : ]
number = number[: j]
break
result.append([head, number, tail])
head, number, tail = '', '', ''
break
result = sorted(result, key = lambda x : (x[0].lower(), int(x[1])))
answer = []
for x in result:
answer.append(x[0] + x[1] + x[2])
return answer
- 시도해본 풀이:
소문자로 정렬하는 방법이랑 숫자 정렬하는 법에 대해서 몰랐다
그리고 head, number, tail 잘못 나눈 것 같다
-> 반례
["foo010bar020.zip", "foo9.txt", "F-15"]일 때, result = [['foo', '010', 'bar020.zip', 'bar020'], ['foo', '9', '.txt'], ['F-']]
로 의도와 다른 값이 생성되므로 틀린 풀이다
def solution(files):
result = []
#문자는 소문자로 바꾸고 head, number, tail분리 해서 result 배열에 추가한다
#숫자 정렬이랑 문자 정렬
for file in files:
temp = []
idx = 0
for i in range(1, len(file)):
if not file[i - 1].isdigit() and file[i].isdigit():
if idx == 0:
temp.append(file[idx : i])
idx = i
if file[i - 1].isdigit() and not file[i].isdigit():
if idx != 0 :
temp.append(file[idx : i])
idx = i
if len(temp) == 2 and idx != 0:
temp.append(file[idx : ])
result.append(temp)
result = sorted(result, key = lambda x : (x[0].lower(), int(x[1])))
answer = []
for x in result:
answer.append(x[0] + x[1] + x[2])
return answer
'코딩테스트 > 기출' 카테고리의 다른 글
[연습 문제 / 프로그래머스] 131127번 : 할인 행사 (0) | 2022.10.10 |
---|---|
[월간 코드 챌린지 시즌2 / 프로그래머스] 77885번 : 2개 이하로 다른 비트 (0) | 2022.10.05 |
[Summer/Winter Coding(~2018) / 프로그래머스] 49994번 : 방문길이 (0) | 2022.09.26 |
[2018 KAKAO BLIND RECRUITMENT / 프로그래머스] 17679번 : [1차] 프렌즈4블록 (0) | 2022.09.23 |
[Summer/Winter Coding(~2018)/ 프로그래머스] 49993번 : 스킬트리 (0) | 2022.09.23 |