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