[0323 Algorithm] 파일명 정렬

shinychan95·2020년 3월 23일
1
post-thumbnail

첫 번째 문제

파일명 정렬
@카카오 코딩테스트 3차

문제를 요약하자면, 파일명을 HEAD, NUMBER, TAIL 세 구간으로 나누고 HEAD 순으로 정렬하고 같을 시 NUMBER 순으로 정렬하는 것이다.

나는,

각각 정렬하는 것이 아니라 한방에 정렬 하고 싶었다. 그렇기에 HEADNUMBER의 문자열 사이즈를 맞춰서 합쳐서 정렬해야 했다. HEAD는 뒷부분에 스페이스를 붙이고, NUMBER는 앞부분에 0을 붙여서 구현하여 했다. 하지만, 20개의 테스트 중 16개만 성공하였다.

["AF-010", "A-1", "GDD-0003"]["AF- 0010", "A- 0001", "GDD-0003"]

 

맞닥뜨린 한계 해결 과정

예외 4가지가 왜 발생하는지 알아내지 못했다
물론 문자열 뒤에 스페이스를 더한 것이 의심갔다. 하지만 찾아봐도 아니었다.

정렬 순서 관련 검색 결과

위 사진을 보면, 다음과 같은 순서로 정렬된다고 나와 있다. 문제에서 정의한 사전 순 정렬이 사실 정확히 어떤 순서인지 몰라서 찾아본 것이다. 그래서 찾은 결과 문자 및 특수 기호는 Whitespace보다 뒤로 정렬되기에 더욱 고민에 빠졌다.

 

Special Characters Order 검색 결과

Space가 제일 앞이잖아!
하지만, 이때 그냥 "A""A "가 같은 순서로 취급된다는 문제를 알게 되었다.

그래서 직접 해보니 위에서 찾아본 것과 아예 달랐다.

 

ASCII 위키백과

해결법
HEAD 문자 부분에 "!"를 뒤에 추가하고, " ""#"로 변환한다.

ASCII 순서 바탕으로

 

내 코드 및 좋은 코드

내 코드

import re


def solution(files):
    answer = []
    HEAD = {}
    NUMBER = {}
    p = re.compile("[0-9]{1,5}")
    for i, file in enumerate(files):
        s = p.search(file)
        HEAD[i] = file[:s.start()].lower()
        NUMBER[i] = file[s.start():s.end()]
    
    max_HEAD_len = max([len(i) for i in HEAD.values()])
    max_NUMBER_len = max([len(i) for i in NUMBER.values()])
    
    result = {}
    for i in range(len(files)):
        result[i] = HEAD[i]
        for j in range(max_HEAD_len - len(HEAD[i])):
            result[i] += "!"
        result[i] = result[i].replace(" ", "#")
        
    for i in range(len(files)):
        for j in range(max_NUMBER_len - len(NUMBER[i])):
            result[i] += "0"
        result[i] += NUMBER[i]

    result = [ i[0] for i in sorted(result.items(), key=lambda t : t[1])]
    
    print(result)
    
    for i in result:
        answer.append(files[i])
    
    return answer

인터넷에서 찾은 개쩌는 코드

import re

def solution(files):
    # 1
    temp = [re.split(r"([0-9]+)", s) for s in files]
    
    # 2
    sort = sorted(temp, key = lambda x: (x[0].lower(), int(x[1])))
    
    # 3
    return ["".join(s) for s in sort]

 

추가로 알게된 것

re.split() 인자 내 정규식에서 ()가 있고 없고 따라 결과가 다르다.
REF 더 읽어보겠습니다. Python님.

 

profile
개발자로 일하는 김찬영입니다.

0개의 댓글