https://programmers.co.kr/learn/courses/30/lessons/17686
def solution(files):
d = {}
for i in range(len(files)):
d[i] = files[i]
files2 = []
answer = []
for j, file in enumerate(files):
middle_index = 0
third_index = -1
for i in range(len(file)):
if file[i] >= '0' and file[i] <= '9':
middle_index = i
break
for i in range(middle_index, len(file)):
if file[i] < '0' or file[i] > '9':
third_index = i
break
if third_index - middle_index >5: third_index = middle_index+5
a = file[:middle_index]
a = a.lower()
b = file[middle_index:third_index] if third_index != -1 else file[middle_index:]
b = b.lstrip('0')
b = int(b) if b != "" else 0
files2.append(((a,b,j),j))
files2.sort(key = lambda x: (x[0][0], x[0][1],x[0][2]))
for file in files2:
answer.append(d[file[1]])
return answer
dict를 통해 기본으로 주어진 문자와 순서를 기억해두고
변환 조건에 맞춰 변환한 순서를 알아낸 후
해당 순서대로 정렬하는 아이디어를 생각했다.
주어진 조건대로 크게 3덩이로 나누어,
1. 문자부분
2. 숫자부분
3. 그외부분
이런식으로 먼저 분류를 했다.
대소문자 구분이 없기에 1의경우 모두 소문자로 변경해주었고,
숫자파트의 경우 lstrip를 통해 맨 앞의 0을 모두 제거해주었고,
2 < 13 처럼 첫 글자 순이 아닌 숫자로 대소비교를 해주기 위해 int 형으로 변경해주었다.
근데 0000같은 input이 들어와서 전부다 제거되면 ""이 남아서 int형으로 변환할때 런타임 에러가 생긴다.
그래서 이런식으로
b = int(b) if b != "" else 0
만약 ""일경우 0으로 받게 해주었다.
이 부분 처리를 안해서 한참 헤맸다...
순서를 정할때 필요없는 파트이므로 아예 빼버렸다.
이렇게 해서 1번,2번 파트의 결과물을 a,b로 놓고
(a,b,초기순서) 이렇게 튜플로 리스트를 만들어 sort의 lambda 기능을 통해 조건에 맞는 순서대로 sort해주었다.
이렇게하면 최종적으로 출력해야하는 순서를 알게되고,
문제에서 주어진걸 변형을 시켰기 때문에 초기 상태를 얻기 위해서 처음에 만들어둔 dictionary를 통해 순서에 해당하는 초기값들을 answer에 차례대로 넣어서 리턴해준다!
끝.