[Python] 카카오(2) 파일명정렬

Updated: Categories:

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

아이디어

  1. 파일명은 HEAD, NUMBER, TAIL 세부분으로 나누어져 있다고 했으므로 주어진 파일명 문자열을 분리해야 합니다.
  2. 파일명 문자열을 처음으로 숫자가 나오는 지점까지 순회합니다.
  3. 처음 숫자가 나오는 인덱스를 저장하고, 그 인덱스부터 최대 인덱스+5까지 순회합니다.
  4. 만약 다섯번을 순회하기 전에 파일명이 끝난다면 그냥 마지막 인덱스를 저장합니다.
  5. 또, 다시 문자가 등장하면 그 전 인덱스까지 저장합니다.
  6. 저장된 인덱스를 사용하여 두 부분으로 나눕니다. tail은 정렬에 영향을 주지 않으니 저장하지 않습니다.
  7. HEAD먼저 정렬 후 NUMBER를 정렬합니다.

알게 된 함수/방법

  • 문자열.isdigit() : 문자열이 완벽한 숫자형태인지 확인하여 bool값 반환.
  • sorted의 키값에 두 가지 정렬 조건을 설정할 수 있다.
    sorted(리스트, key = lambda x : (x[1], x[2]))
    
  • 숫자 정렬 시 문자열일 땐 1, 10, 2… 순으로 정렬되고 숫자일땐 1, 2, 10… 순으로 정렬된다.
  • ‘00005’의 문자열을 int로 형변환하면 5가 된다.

정답 코드

def solution(files):
    s_files = []
    for f in files:
        # head
        for j in range(len(f)):
            if str(f[j]).isdigit():
                start = j
                break
        # number
        for k in range(start, start+5):
            end = k+1
            if k == len(f)-1:
                break
            if str(f[k]).isdigit()==0:
                end-=1
                break
        s_files.append([f, f[:j].lower(), int(f[start:end])])

    s_files = sorted(s_files, key = lambda x : (x[1], x[2]))
    answer=[]
    for f in s_files:
        answer.append(f[0])
    return answer