Skip to content
This repository was archived by the owner on Mar 18, 2024. It is now read-only.

Commit 356ff83

Browse files
authored
Create 파일명 정렬 sumin.py
Create 파일명 정렬 sumin.py
1 parent dc33513 commit 356ff83

File tree

1 file changed

+111
-0
lines changed

1 file changed

+111
-0
lines changed

Programmers/파일명 정렬/sumin.py

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
"""
2+
풀이시간: 20분
3+
4+
<input>
5+
files: 파일명(100글자 이내, 영문 대소문자, 숫자, 공백, 마침표, 빼기 부호만으로 이루어져있음), 1000개 이하의 파일
6+
- 영문자로 시작하며, 숫자를 하나 이상 포함
7+
- HEAD: 최소 한 글자 이상의 문자
8+
- NUMBER: 한 글자에서 최대 다섯글자 사이의 연속된 숫자(앞쪽에 0이 올 수 있음. 0~9999 사이의 숫자)
9+
- TAIL: 숫자가 다시 나타날 수도, 아무 글자도 없을 수도 있다.
10+
11+
<solution>
12+
head, number, tail을 나눠주고 정렬
13+
14+
<시간복잡도>
15+
O(1000 * 100): files의 크기 * file의 최대 길이
16+
17+
<회고>
18+
head, number, tail을 일일히 나눠서 구현했는데..
19+
다른 사람들 풀이를 보니 정규표현식으로 아주 깔끔하게 구현한 걸 확인..
20+
21+
[정규표현식 풀이]
22+
정규표현식으로 구현할 때, number를 먼저 정렬하고, head를 정렬한다. 순서가 바뀌는 점 주의!
23+
또, 파이썬 정렬에서 ['123', '0123']의 각 원소를 int로 변환해 정렬한다 했을 때, 같은 값이라면 순서도 유지된다는 걸 처음 알았음..
24+
"""
25+
from typing import List
26+
27+
28+
def solution(files: List[str]) -> List[str]:
29+
answer = [] # 정렬된 파일명
30+
31+
for idx, file in enumerate(files):
32+
head, number, tail = '', '', ''
33+
# head, number, tail로 나누기
34+
for x in file:
35+
# 1) head는 숫자가 아닌 문자
36+
if not number and not x.isdigit():
37+
head += x
38+
# 2) number는 숫자
39+
elif not tail and x.isdigit():
40+
number += x
41+
# 3) tail은 그 외 나머지 부분(숫자가 다시 나타날 수도, 아무 글자도 없을 수도 있음)
42+
elif head and number:
43+
tail += x
44+
45+
answer.append((head, number, tail, idx))
46+
# 1. head 사전 순 정렬 -> 2. number의 숫자순으로 정렬 -> 3. 원래 입력에 주어진 순서로 정렬
47+
answer.sort(key=lambda f: [f[0].lower(), int(f[1]), f[-1]])
48+
49+
# map과 lambda 함수를 사용해 각 튜플을 연결된 문자열로 변환
50+
answer = list(map(lambda file: ''.join(map(str, file[:-1])), answer))
51+
return answer
52+
53+
"""
54+
정확성 테스트
55+
테스트 1 〉 통과 (0.07ms, 10.7MB)
56+
테스트 2 〉 통과 (0.05ms, 10.7MB)
57+
테스트 3 〉 통과 (199.79ms, 11.1MB)
58+
테스트 4 〉 통과 (219.57ms, 11.4MB)
59+
테스트 5 〉 통과 (222.30ms, 11.2MB)
60+
테스트 6 〉 통과 (190.55ms, 11.2MB)
61+
테스트 7 〉 통과 (241.18ms, 11.1MB)
62+
테스트 8 〉 통과 (202.50ms, 11.2MB)
63+
테스트 9 〉 통과 (162.69ms, 11.1MB)
64+
테스트 10 〉 통과 (165.78ms, 11.1MB)
65+
테스트 11 〉 통과 (189.86ms, 11.3MB)
66+
테스트 12 〉 통과 (202.04ms, 11.2MB)
67+
테스트 13 〉 통과 (193.55ms, 11.1MB)
68+
테스트 14 〉 통과 (213.60ms, 11.3MB)
69+
테스트 15 〉 통과 (268.70ms, 11.2MB)
70+
테스트 16 〉 통과 (184.06ms, 11.2MB)
71+
테스트 17 〉 통과 (191.54ms, 11MB)
72+
테스트 18 〉 통과 (187.65ms, 11MB)
73+
테스트 19 〉 통과 (186.75ms, 11MB)
74+
테스트 20 〉 통과 (186.83ms, 11.3MB)
75+
"""
76+
77+
78+
79+
# 정규표현식 풀이
80+
import re
81+
82+
83+
def solution(files):
84+
# number 정렬 후 head를 정렬해야 한다.
85+
files = sorted(files, key=lambda file: int(re.findall('\d+', file)[0]))
86+
files = sorted(files, key=lambda file: re.split('\d+', file.lower())[0])
87+
return files
88+
89+
"""
90+
정확성 테스트
91+
테스트 1 〉 통과 (0.14ms, 10.4MB)
92+
테스트 2 〉 통과 (0.10ms, 10.2MB)
93+
테스트 3 〉 통과 (3.12ms, 10.5MB)
94+
테스트 4 〉 통과 (5.10ms, 10.4MB)
95+
테스트 5 〉 통과 (2.76ms, 10.5MB)
96+
테스트 6 〉 통과 (2.58ms, 10.4MB)
97+
테스트 7 〉 통과 (3.96ms, 10.5MB)
98+
테스트 8 〉 통과 (2.36ms, 10.6MB)
99+
테스트 9 〉 통과 (2.39ms, 10.4MB)
100+
테스트 10 〉 통과 (3.13ms, 10.4MB)
101+
테스트 11 〉 통과 (2.56ms, 10.4MB)
102+
테스트 12 〉 통과 (2.75ms, 10.4MB)
103+
테스트 13 〉 통과 (2.66ms, 10.5MB)
104+
테스트 14 〉 통과 (3.72ms, 10.6MB)
105+
테스트 15 〉 통과 (3.68ms, 10.4MB)
106+
테스트 16 〉 통과 (2.44ms, 10.4MB)
107+
테스트 17 〉 통과 (2.47ms, 10.5MB)
108+
테스트 18 〉 통과 (2.57ms, 10.5MB)
109+
테스트 19 〉 통과 (2.72ms, 10.5MB)
110+
테스트 20 〉 통과 (2.92ms, 10.3MB)
111+
"""

0 commit comments

Comments
 (0)