[프로그래머스] 파일명 정렬

문제

단순한 문자 코드 순이 아닌, 파일명에 포함된 숫자를 반영한 정렬 기능을 저장소 관리 프로그램에 구현하기로 했다.

  • 파일명은 크게 HEAD, NUMBER, TAIL의 세 부분으로 구성된다.
    • HEAD: 숫자가 아닌 문자로 이루어져 있으며, 최소한 한 글자 이상이다.
    • NUMBER: 한 글자에서 최대 다섯 글자 사이의 연속된 숫자로 이루어져 있으며, 앞쪽에 0이 올 수 있다. 0부터 99999 사이의 숫자로, 00000이나 0101 등도 가능하다.
    • TAIL: 그 나머지 부분으로, 여기에는 숫자가 다시 나타날 수도 있으며, 아무 글자도 없을 수 있다.
  • 파일명 정렬
    • 우선 HEAD 부분을 기준으로 사전 순으로 정렬한다. 이때, 문자열 비교 시 대소문자 구분을 하지 않는다.
    • 그 다음 NUMBER의 숫자로 정렬한다. 9 < 10 < 0011 < 012 < 13 < 014 순으로 정렬된다.
    • HEAD와 NUMBER가 같을 경우, 원래 입력에 주어진 순서를 유지한다.

입력형식

입력으로 배열 files가 주어진다.

  • files는 1000개 이하의 파일명을 포함하는 문자열 배열이다.
  • 각 파일명은 100 글자 이하 길이로, 영문 대소문자, 숫자, 공백(""), 마침표("."), 빼기 부호("-")만으로 이루어져 있다. 파일명은 영문자로 시작하며, 숫자를 하나 이상 포함하고 있다.
  • 중복된 파일명은 없으나, 대소문자나 숫자 앞부분의 0 차이가 있는 경우는 함께 주어질 수 있다. (muzi1.txt,MUZI1.txt,muzi001.txt,muzi1.TXT는 함께 입력으로 주어질 수 있다.)

출력형식

위 기준에 따라 정렬된 배열을 출력한다.

코드

def solution(files):
    answer = []
    for file in files:
        answer.append([file, getData(file)])
    answer.sort(key = lambda x : (x[1][0],x[1][1]))
    return [x[0] for x in answer]

def getData(file):
    result, i = [], 0
    for index, w in enumerate(file):
        if '0'<=w<='9' and len(result) == 0:
            result.append(file[:index].lower())
            i = index
        elif not '0'<=w<='9' and len(result) == 1:
            result.append(int(file[i:index]))
            i = index
            break
    if len(result) == 1:
        result.append(int(file[i:]))
    return result

좋은 웹페이지 즐겨찾기