문제:
풀이방법:
우선 파일명을 HEAD, NUMBER, TAIL로 정리를 해야한다. 이를 위해서 isdigit이라는 숫자인지 확인하는 함수를 사용한다.
처음 isdigit이 참이 되는 순간 이전까지의 글자가 HEAD가 되므로 isdigit이 참이 되는 순간 parser에 값을 추가하고 break를 걸어서 반복문을 나온다.
해당 위치부터 다시 반복문을 사용해서 이번에는 isdigit이 거짓이 되는 순간이 NUMBER의 끝이므로 parser에 값을 추가하고 break를 걸어서 반복문을 나온다.
이제 남은 부분은 TAIL에 해당하므로 parser에 추가해주면 되지만 TAIL이 아무것도 없을 경우에는 위 NUMBER를 파악하는 과정에서 맨 마지막 숫자가 추가되지 못했을 것이다. 따라서 해당 인덱스에 isdigit을 사용해서 참이면 TAIL이 없는 경우, 거짓이면 TAIL이 있는 경우를 의미한다.
이제 파일명을 HEAD, NUMBER, TAIL로 나눴으므로 sort의 key를 사용해서 정렬을 하도록 한다. 우선 HEAD를 기준으로 사전 순 정렬을 하고, 대소문자 구별을 하지 않는다. 그리고 HEAD가 동일하다면 NUMBER가 작은순으로 정렬을 하는데 스트링 상태가 아닌 int 상태로 변환해서 정렬을 해야 한다. 따라서 sort의 key는 (x[0].upper(), int(x[1])) 이 된다. 이처럼 해야지 원래 파일명을 보존하면서 정렬을 할 수 있다.
정렬을 완료했으므로 이를 다시 붙여서 출력을 해야 한다. TAIL이 있는 경우에는 parser에 2번째 인덱스가 존재하지만 없다면 1까지만 존재한다. 따라서 이를 try~ except ~ 예외처리 구문을 사용해서 추가하도록 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
def solution(files):
parser=[]
for idx,file in enumerate(files):
parser.append([])
for i,f in enumerate(file):
if f.isdigit():
parser[idx].append(file[:i])
break
for i1 in range(i,len(file)):
if not file[i1].isdigit():
parser[idx].append(file[i:i1])
break
if file[i1].isdigit():
parser[idx].append(file[i:])
else:
parser[idx].append(file[i1:])
parser.sort(key=lambda x: (x[0].upper(),int(x[1])))
answer=[]
for parse in parser:
try:
answer.append(parse[0]+parse[1]+parse[2])
except:
answer.append(parse[0]+parse[1])
return answer
|
cs |
문제링크:
https://programmers.co.kr/learn/courses/30/lessons/17686
'Algorithm > Python' 카테고리의 다른 글
[Programmers]Lv 2. 멀쩡한 사각형 (0) | 2019.12.05 |
---|---|
[Programmers]2018 Kakao. n진수 게임 (0) | 2019.12.04 |
[Programmers]2018 Kakao.압축 (0) | 2019.12.02 |
[Programmers]2018 Kakao.방금그곡 (0) | 2019.12.01 |
[Programmers]2020 Kakao.괄호 변환 (0) | 2019.11.15 |