본문 바로가기

알고리즘

[programmers] 파일명 정렬


로직

 - 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