🤔 문제


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

 

코딩테스트 연습 - [3차] 파일명 정렬

파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램

programmers.co.kr

😀 풀이


본 문제는 주어진 파일명 배열을 몇 가지 조건에 따라 정렬하면 되는 문제입니다.

따라서 배열을 정렬하는 기준인 key 값에 적절한 함수를 넣어주면 풀이할 수 있음을 쉽게 떠올릴 수 있습니다.

 

문제에서 주어진 정렬 조건은 크게 두 가지가 있습니다.

 

1. HEAD 부분

HEAD 부분의 경우 파일명의 맨 앞부분부터 숫자가 나오기 직전까지입니다. 
이 부분을 얻기 위해 풀이 코드에서는 getHead 라는 함수를 만들었고 getHead의 입출력 예시는 아래와 같습니다.

1) getHead(foo010bar020.zip) ➔ foo

2) getHead(ABCad1123.jpg) ➔ abcad

대소문자는 정렬기준에 포함되지 않고 같게 취급한다는 문제 조건에 의해 getHead함수의 리턴값은 모두 HEAD 부분을 추출해 소문자로 변환시켰습니다.

 

2. NUMBER 부분

NUMBER 부분의 경우 HEAD 부분을 지나 숫자가 나오는 구간입니다.
이때 NUMBER 부분을 한 번 지난 뒤 나온 숫자에 대해서는 NUMBER 부분으로 취급하지 않습니다.
NUMBER 부분을 얻기 위해 풀이 코드에서는 getNumber 라는 함수를 만들었고 getHead와 비슷한 구조지만 NUMBER 부분을 한 번 지났는지에 대한 여부를 체크하기 위해 isTail이라는 변수를 만들었습니다. 

 

getHead, getNumber 이 두 가지 함수를 기준으로 하여 주어진 입력 배열을 정렬해주면 문제에서 원하는 정답을 얻을 수 있습니다.

 

💻 풀이 코드는 아래와 같습니다.

def getHead(file):
    res = ""
    for c in file:
        if c.isdigit():
            break
        else:
            res += c
    return res.lower()

def getNumber(file):
    res = ""
    isTail = False
    for c in file:
        if c.isdigit():
            isTail = True
            res += c
        elif isTail:
            break
    return int(res)

def solution(files):
    answer = sorted(files, key = lambda x : (getHead(x), getNumber(x)))
    return answer
반응형
복사했습니다!