본문 바로가기

코딩테스트/Python

[프로그래머스] [3차] 파일명 정렬 - (다시 풀어보기)

내 코드

def solution(files):
    tmp = []
    
    for idx1,i in enumerate(files):
        head = num = tail= ''
        for idx2,j in enumerate(i):
            if j>='0' and j<='9':
                if len(num)>=5: break
                num+=j
            elif len(num)==0:
                head+=j
            else:
                break
        tail+=i[idx2:]
        tmp.append([head.lower(),int(num),tail,idx1])
    
    return [files[tp[3]] for tp in sorted(tmp,key=lambda x:(x[0],x[1],x[3]))]

오랜만에 코테풀어봄 !! 오랜만에 하니까 너무 재밌다.. 휴... 

문제에서 주어진대로 head,num,tail을 구하고 정렬을 해주었다.

0~9 문자가 나오기 전까지 head에 저장시켜준다. 이때 num의 길이를 체크하여 0~9 문자 출현 여부를 확인할수있다.

만약 0~9 문자가 나오면 num에 저장시킨다. num의 길이가 5가 넘어가면 더이상 num에 더하지않고 tail에 끝 문자까지 저장시킨다.

tmp에 저장시킬때에는 head,num,tail,index위치를 저장시켰다. 이때 head는 대소문자 구분을 하지않기 위해 모두 소문자로 바꿔주었고 num은 int형으로 바꿔주었다.

그다음 sort를 해주었다. 정렬된 index를 가지고 files의 값을 가져와서 return 해주었다.

 

 

다른사람 코드

import re

def solution(files):
    a = sorted(files, key=lambda file : int(re.findall('\d+', file)[0]))
    b = sorted(a, key=lambda file : re.split('\d+', file.lower())[0])
    return b

아... 정규식 화나네 진짜^^? 내가 정처기 다하면 정규식 뿌순다//.. 기다려;; 

 

일단 files 안에 있는 숫자들을 찾아서 int형으로 바꿔준다. 문자열중에서 찾은 숫자가 많을 수도 있기 때문에 가장 첫번째 숫자만 가져와 ([0]) 그 숫자를 가지고 리스트를 정렬해준다.

그 다음 files를 소문자로 바꾼다음 숫자를 찾아 split해준다. 숫자를 기준으로 나눠지기 때문에 여러 문자가 생긴다. 이 문자중에서 가장 첫번째 것을 기준으로 정렬해준다.

 

근데 여기서 number 부분이 5자리 이상일 경우 예외처리가 안되어있다고 한다. 댓글에서는 '\d{1,5}' 를 하면 될거라고 한다.