알고리즘/프로그래머스

[프로그래머스] 파이썬 _ 파일명 정렬 (2018 KAKAO)

이숭간 2021. 8. 21. 15:15
728x90

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

 

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

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

programmers.co.kr

 

문제유형 : 문자열구현

 

문제풀이 :

  • head, number, tail로 분리하기
  • sorted의 lambda로 다중정렬기준 주기
  • 비교시에 head의경우 대소문자 구분없는것으로 비교하고 출력때는 원래것, number도 마찬가지로 비교는 숫자로 바꿔서 비교하고 출력할때는 다시 원래것(문자열)로 해야하기때문에 튜플로 묶어서 저장한다.
  • 비교시에는 튜플의 1번쨰 원소를 기준으로 비교하고 정렬된후 출력에는 튜플의 0번째 원소를 출력하도록 한다.

 

정답코드 :

def solution(files):
    answer = []
    info = []
    for f in files:
        h, n, f = seperate(f)
        info.append([(h, h.lower()),(n, int(n)),f])
    
    # 비교하는부분 - 비교시에는 소문자로 바꾼값을 기준으로 정렬, 정수값을 기준으로 정렬 (튜플의 1번쨰 원소)
    info = sorted(info, key=lambda x:(x[0][1], x[1][1]))
    print(info)
    
    for i in info:
        temp = ''
        for j in range(len(i)):
            if j!=2:
                temp += i[j][0]
            else:
                temp += i[j]
        answer.append(temp)
            

    return answer

def seperate(fileName):
    head = getHead(fileName)
    h = len(head)
    number = getNumber(fileName[h:])
    n = len(number)
    tail = fileName[n+h:]
    print(tail)
    return head, number, tail



def getHead(string):
    head = ''
    for s in string:
        if not s.isdigit():
            head += s
        else:
            return head

def getNumber(string):
    num = ''
    for s in string:
        if s.isdigit():
            num += s
        else:
            return num
    else:
        return num