본문 바로가기

개발/Algorithm

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

Programmers, 파일명 정렬

2018년 카카오 블라인드 채용 출제 문제

TL;DR

  • 정렬(sort)
  • 구현(implementation)

문제 요약

1. 주어진 파일명을 3개의 부분으로 나누어 기준에 따라 정렬을 하는 프로그램을 작성해야 한다.
2. 파일명은 HEAD, NUMBER, 입력 순으로 정렬된다.
    2-1. HEAD는 숫자가 아닌 문자로 이루어져 있는 최소 한 글자 이상의 문자이다.
    2-2. NUMBER는 한 글자에서 최대 다섯 글자 사이의 연속된 숫자로 앞쪽에 0이 올 수 있다.
    2-3. 나머지 부분은 TAIL으로 숫자가 다시 나타날 수 있으며 아무 글자가 없을 수도 있다.

 

- 문제에서 주어지는 조건을 만족시키면서 정렬할 수 있도록 구현하는 문제이다.

- 주어진 입력을 HEAD, NUMBER, TAIL 순으로 파싱한 후 각 파싱한 부분을 정렬에 사용하면 해결할 수 있다.

입출력 형태

입출력 예시

 

예시 1 ::

- HEAD의 경우 대소문자 구분을 하지 않는다. 모두 동일하므로 NUMBER를 확인해야 한다.

- NUMBER의 순서대로 정렬되었다. 1과 01은 동일한 값이지만 1이 먼저 입력되었으므로 입력 순서에 따라서 1이 앞에 와야 한다.

 

예시 2. :

- HEAD, NUMBER 순으로 정렬된다.

풀이

def solution(files):
    answer = []

    for file in files:
        head, number, tail = '', '', ''
        isDigit = False
        # head, number, tail을 분리
        for i in range(len(file)):
            if file[i].isdigit():
                number += file[i]
                isDigit = True
            elif not isDigit:
                head += file[i]
            else:
                tail += file[i:]
                break
        answer.append((head, number, tail))
        
    answer.sort(key=lambda x: [x[0].lower(), int(x[1])])
    return [''.join(item) for item in answer]

 

주어진 파일 이름을 각 부분으로 파싱을 먼저 진행해야 한다.

각 파일 이름을 구성하고 있는 문자들을 확인한다. 이 때, isDigit이라는 boolean 변수를 통해 HEAD와 NUMBER를 구분한다.

- HEAD는 항상 NUMBER보다 먼저 온다. 이 때는 isDigit을 False일 때이다. HEAD가 기록되고 나면 그 이후에는 NUMBER가 된다.

- NUMBER에서는 isDigit을 True로 만든다. 이 조건을 넣지 않을 경우 TAIL에 해당하는 부분이 문자가 되었을 때 다시 HEAD에 기록될 수 있기 때문이다.

- 조건에 해당하지 않는 부분들은 모두 TAIL로 처리하여 리스트에 넣는다.

 

구현을 통해 주어진 파일이 HEAD, NUMBER, TAIL로 파싱된 튜플이 저장된 리스트를 얻을 수 있다. 이제는 문제에서 주어진 조건에 따라서 리스트를 정렬하면 된다.

key 속성에 HEAD를 소문자로 바꾼 값을 가장 우선적으로 정렬하고 NUMBER를 숫자로 바꾼 값을 다음 기준으로 정렬한다.

- HEAD를 소문자로 바꾸는 이유는 문제에서 대-소문자 구분을 하지 않는다고 하였기 때문이다. 소문자로 바꾸지 않을 경우 img 뒤에 IMG가 오게 된다.

- NUMBER를 숫자로 바꾸는 이유는 1과 01을 같은 수로 취급하기 때문이다. 숫자로 바꾸지 않을 경우 문자열로 인식하게 되므로 문제에서 원하는 조건에 따라서 정렬되지 않는다.

 

정렬된 리스트 내의 튜플을 문자열로 바꾸어 리스트에 담아 반환하면 정답을 얻을 수 있다.

 

다른 풀이

정규식(Regex)를 사용하여서도 문제를 해결할 수 있다.

 

반응형