본문 바로가기

Python 코딩테스트

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

반응형

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이:

알고리즘은 아래와 같다.

1. head, number, tail로 분리

2. sorted의 lambda로 다중 정렬 기준 주기

3. 비교시에 head의 경우 대소문자 구분 없는 것으로 비교하고 출력 때는 원래 것, number도 마찬가지로 비교는 숫자로 바꿔서 비교하고 출력할 때는 다시 원래 것 (문자열)로 해야 하기 때문에 튜플로 묶어서 저장한다.

4. 비교시에는 튜플의 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
반응형