def solution(files):
sort_files = []
result = []
cnt = 0
for file in files:
head, num, tail = [], [], []
for ch in file:
if not ch.isdigit() and not num:
head.append(ch)
elif ch.isdigit() and not tail:
num.append(ch)
else:
tail.append(ch)
if not tail:
sort_files.append([''.join(head), ''.join(num), '', cnt])
else:
sort_files.append([''.join(head), ''.join(num), ''.join(tail), cnt])
cnt += 1
sort_files = sorted(sort_files, key=lambda x: [x[0].lower(), int(x[1]), x[3]])
for i in sort_files:
del i[3]
result.append(''.join(i))
return result
- 처음 문제를 봤을때 정규 표현식으로 풀면 되겠다고 떠올렸지만 아직 정규표현식을
제대로 공부하지 않아 익숙하지도 않고 문제부터 풀어보자 라는 생각으로 풀었다- 다 푼 후 다른사람의 풀이를 봤을때 정규표현식을 사용하여 2줄만에 끝낸 것을 보고 현타가 왔다 ㅠㅠ 빨리 정규표현식 익숙해 져야지...
입출력
위 그림과 같이 앞부분 문자가 들어온 후 (HEAD)
숫자가 들어온다 (NUMBER)
그 뒤 들어오는 TAIL 부분은 문자 - 숫자 식으로 들어와도 TAIL로 정렬되어야 한다
for ch in file:
if not ch.isdigit() and not num:
head.append(ch)
elif ch.isdigit() and not tail:
num.append(ch)
else:
tail.append(ch)
isdigit() -> 숫자면 True, 숫자가 아니라면 False 반환하는 함수로
isdigit을 사용하여 숫자, HEAD를 구분하였으며,not num not tail
위 조건을 통하여 HEAD -> NUMBER -> TAIL
순으로 채워지는 리스트에서 NUMBER로 넘어갔다면 HEAD list에 더해주지 않는 식으로
작성하였다
if not tail:
sort_files.append([''.join(head), ''.join(num), '', cnt])
else:
sort_files.append([''.join(head), ''.join(num), ''.join(tail), cnt])
cnt += 1
문제 조건에 TAIL이 빈 문자열 일 수 있다하여 위와 같이 작성
cnt 값은 파일명이 완전히 같을 경우 입력순서에 따라 정렬하라고 명시되어 있어
리스트 끝에 추가해 주었다
sort_files = sorted(sort_files, key=lambda x: [x[0].lower(), int(x[1]), x[3]])
sorted를 사용하여 HEAD 부분, NUMBER 부분, cnt로 선언해준 입력 순서 부분으로 정렬
for i in sort_files: del i[3] result.append(''.join(i))
cnt부분은 지우고 문자를 합치고 결과로 return