프로그래머스

LV2 [KAKAO] [3차] 파일명 정렬

whiporithm 2023. 6. 20. 18:10


문제

https://school.programmers.co.kr/learn/courses/30/lessons/17686?language=python3 

 

프로그래머스

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

programmers.co.kr

 

풀이

최대한 다중정렬을 활용하려 해서 풀이했다.

 

우선 head, number, tail부분으로 나누었다. (코드상에는 tail은 body 에 들어간다.)

 

다중 정렬시에 문제가 좀 있었는데, 오름차순이나 내림차순 정도로만 기준을 정할 수 있는것이였다.

대소문자 구분을 하지 않는 추가조건이나 , 다른 정렬방법을 넣는 방식을 (아마 내가 몰라서) 취할 수 없었다.

 

따라서 모든 문자를 소문자로 변환시킨다음에 넣어주고, 정렬은 그 문자를 기준으로 한다음 정답에는 원본을 넣어주었다.

 

다음 문제는 10, 1, 5 와 같은 숫자들의 정렬 문제였는데 그냥 정렬하면 1 10 5 순으로 정렬된다.

이는 앞에 0을 패딩해서 붙여준다음 010 001 005 와 같이 만든후에 정렬함으로 해결했다.

 

코드

def solution(files):

    nums = ['0','1','2','3','4','5','6','7','8','9']
    re_files = []
    for file in files:
        l = len(file)
        i = 0
        while True:
            if '0' <= file[i] <='9':
                break
            i+= 1

        head = [str.lower(file[0:i]), file[0:i]]
        
        j = i
        while j < l:
            if file[j] not in nums:
                break
            j+=1

        padding_count = 100 - (j-i)
        padding = padding_count * '0'

        number = [padding+ file[i:j], file[i:j]]
        tail = file[j:l]

        re_files.append([head, number, tail])

    re_files = sorted(re_files, key = lambda x : (x[0][0], x[1][0]))
    answer = []
    for i in range(len(re_files)):
        answer.append(re_files[i][0][1] + re_files[i][1][1] + re_files[i][2])

    return answer

 

후기

 

다른 사람의 풀이를 보니 정규식등을 이용해서 엄청짧게 해결한 코드가 많았다. 파이썬의 위대함에 미치기에는 나는 아직 많이 부족한 거 같다.. ㅋㅋㅋ 

'프로그래머스' 카테고리의 다른 글

LV2 [KAKAO] 튜플  (0) 2023.08.14
LV2 [KAKAO] [1차] 프렌즈4블록  (0) 2023.08.14
LV2 [KAKAO] k진수에서 소수 개수 구하기  (0) 2023.06.20
LV2 [KAKAO] 후보키  (0) 2023.06.11
LV2 [KAKAO] n진수 게임  (1) 2023.06.09