🔗 Problem Link
❔Thinking
- 파일명을 주어진 조건에 따라 정렬한다.
- HEAD는 한 글자 이상의 문자로 이루어져있고, (" ", ".", "-") 가 가능하다.
- NUMBER는 한 글자 이상 다섯 글자 이하의 연속된 숫자이다. (공백이 없는 숫자의 나열)
- TAIL은 나머지로, 조건에 제시된 공백과 마침표, 빼기 부호와 숫자 문자가 모두 가능하다.
- 파일명은 HEAD -> NUMBER 순으로 기준을 잡아 정렬한다.
- 모든 정렬 기준이 동일할 경우, 입력된 순서를 유지한다.
💻Solution
1. window를 활용한 풀이
def HeadNumberTail(file:str)->list:
HNT_list = []
left, right = 0, 1
while True:
if len(HNT_list) >= 2 or right > len(file)-1:
HNT_list.append(file[left:])
break
if file[left].isdigit(): # NUMBER
if file[right] == ' ' or (file[right].isdigit() and (right-left+1) <= 5):
right += 1
else:
HNT_list.append(file[left:right])
left = right
right = left + 1
else: # HEAD
if file[right] == ' ' or not file[right].isdigit():
right += 1
else:
HNT_list.append(file[left:right])
left = right
right = left + 1
return HNT_list
def solution(files):
answer = []
file_list = []
# file name to H.N.T
for file in files:
file_list.append(HeadNumberTail(file))
# sorting
file_list = sorted(file_list, key=lambda x: (x[0].lower(), int(x[1].replace(' ', ''))))
return [''.join(f) for f in file_list]
2. 정규표현식을 활용한 풀이
import re
def HeadNumberTail(file):
head = re.match("[\D]+", file)
number = re.search("[\d]+", file)
return [head[0], number[0], file[number.end():]]
def solution(files):
answer = []
for file in files:
answer.append(HeadNumberTail(file))
answer.sort(key=lambda x: (x[0].lower(), int(x[1])))
return [''.join(file) for file in answer]
🗝️keypoint
- 출력한 결과는 초기 입력 결과와 같아야 하므로, 정렬 시 기존 문자열을 유지해야 한다.
- ["F-", "A-"]를 오름차순으로 정렬하면, ["A-", "F-"]가 된다.
- 숫자로 이루어진 문자열(ex - "0010")을 int()에 넣으면, 앞에 있는 0은 제거된다 (10).
- list는 sort(key=)를 통해 조건에 따라 정렬할 수 있다.
'코딩테스트 > Python' 카테고리의 다른 글
[Baekjoon] 1439번 - 뒤집기 (0) | 2022.09.27 |
---|---|
[Programmers] Level 2. 모음사전 (0) | 2022.09.27 |
[LeetCode] 409. Longest Palindrome (0) | 2022.09.26 |
[Programmers] Level 2. 땅따먹기 (0) | 2022.09.25 |
[Programmers] Level 2. 방문 길이 (0) | 2022.09.25 |