평범한 필기장

[Programmers_Python] 파일명 정렬 본문

코딩 테스트 준비/Programmers

[Programmers_Python] 파일명 정렬

junseok-rh 2023. 6. 20. 19:31

https://school.programmers.co.kr/learn/courses/30/lessons/17686

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

내 풀이방식

처음에 re.findall()를 몰라서 이용하지 않고 풀었다. re.findall()을 모르니 문이렇게 하다보니 테스트케이스에 대해서는 맞았지만 채점을 해보니 런타임 에러가 발생했다. 아래 코드를 보면 엄청 복잡하고 틀린부분도 있었다. 그래서 다른 분들의 블로그를 참고해보니 다들 re.findall() 함수를 이용한 것을 확인했고 다시 풀 때 이 함수를 이용해서 풀었다.

def solution(files):
    dic = dict()
    for file in files:
        a = 0
        b = len(file)-1
        for i in range(len(file)-1):
            if (48 > ord(file[i]) or ord(file[i]) > 57) and 48 <= ord(file[i+1]) <= 57:
                a = i
                break
        for j in range(a+1, len(file)):
            if 48 > ord(file[j]) or ord(file[j]) > 57:
                b = j
                break
        if b == len(file)-1:
            dic[file[:b]] = (file[:a+1].lower(),int(file[a+1:b]))
        else:
            dic[file[:b]] = (file[:a+1].lower(),int(file[a+1:b]),file[b:])    
    items = dic.items()
    items = sorted(items,key = lambda x : x[1][1])
    # print(items)
    items = sorted(items,key = lambda x : x[1][0])
    # print(items)
    answer = []
    for i in range(len(items)):
        if len(items[i][1]) == 3:
            a = items[i][0] + items[i][1][2]
            answer.append(a)
        else:
            a = items[i][0]
            answer.append(a)
    return answer

정답 풀이 방식

re.findall() 함수를 이용하니 HEAD, NUMBER, TAIL을 나누기가 훨씬 간단했다. 그리고 정렬을 할 때, HEAD를 정렬시키고 NUMBER를 정렬시켜야해서 나는 두번에 나눠서 정렬을 시행했지만 한번에 하니까 훨씬 코드가 깔끔해 졌다.

import re

def solution(files):
    answer = []
    # HEAD, NUMBER, TAIL을 나누는 부분
    for file in files:
        answer.append(re.findall("[a-z|A-Z|\-|\.| ]+|[0-9]+",file))
    # HEAD를 사전 방식으로 정렬하고, NUMBER를 숫자 크기 순으로 정렬!
    answer.sort(key = lambda x : (x[0].upper(),int(x[1])))
    answer = [''.join(a) for a in answer]
    return answer

이번 문제를 풀어보고 정규 표현식 이용하는 것이 아직 많이 부족하다는 것을 깨달았다. 정규 표현식도 종종 봐야겠다.