로직
- ls = [(head, numbers, 몇번째 파일인지), (head, numbers, 몇번째 파일인지), (head, numbers, 몇번째 파일인지)]
정렬한 후 sort한다.
- ls만드는 방법 1) 정규식 사용 2) for문 돌리면서 직접 구현(내 코드) -> 이때, head, numbers의 index를 하나씩 바꿔가면서 최종적인 값 내기
- head : 숫자가 나오기 마지막 문자인 곳
numbers : 앞에서부터 숫자가 나온곳부터 시작해서 다시 문자열 나오기 바로전까지
tail : 굳이 나타낼 필요없다 -> tail로는 정렬하지 않기 때문
- 몇번째 파일인지 작성하는 이유 : 두 파일의 HEAD 부분과, NUMBER의 숫자도 같을 경우,
정렬 후에도 입력 시 주어진 두 파일의 순서가 바뀌어서는 안 된다.
코드
def solution(files):
temp = []
numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
for file in range(len(files)):
head, number = 0, 0
for i in range(len(files[file])): # img12.png
if files[file][i].isnumeric():
break
else:
head = i
for i in range(head + 1, len(files[file])):
if files[file][i] in numbers:
number = i
else:
break
temp.append((files[file][:head + 1], files[file][head + 1:number + 1], file))
temp_sort = sorted(temp, key=lambda x: (x[0].upper(), int(x[1]), x[2]))
answer = []
for i in temp_sort:
answer.append(files[i[2]])
return answer
주의할 점
1. ** 문제점 : F-15를 ('F-', '1')로 쪼개야하는데 ('F', '-1')로 쪼갠다 -> '-'를 isalpha()하면 false가 나온다.
if files[file][i].isalpha():
head = i
elif files[file][i].isnumeric(): # isnumeric -> F-15를 ('F', '-1')로 쪼갬
break
** 해결책 : 숫자가 아닌것들을 다 확인해서 head로 보낸다
if files[file][i].isnumeric():
break
else:
head = i
2. 정규식 사용은 어렵다...
import re
def solution(files):
file_lst = [re.split('([0-9]+)',i) for i in files]
file_lst.sort( key = lambda x : ( x[0].lower(), int(x[1]) ) )
return [''.join(lst) for lst in file_lst]
'알고리즘' 카테고리의 다른 글
[programmers] 다리를 지나는 트럭 (0) | 2020.09.04 |
---|---|
[programmers] 네트워크 (0) | 2020.09.04 |
[programmers] 오픈채팅방 (0) | 2020.09.01 |
[programmers] 뉴스 클러스터링 (0) | 2020.08.31 |
[programmers] 튜플 (0) | 2020.08.31 |