IT

[레벨2] 파일명 정렬

자비단 2023. 5. 5. 21:31
반응형

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

 

프로그래머스

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

programmers.co.kr

파일명을 특정 규칙에 따라 정렬하는 문제이다.

def solution(files):
    # HEAD, NUMBER, TAIL로 나누는 함수 정의
    def divide_s(inp):
        tmp = ""
        for i in inp.lower():
            if i.isdigit():
                tmp += i
            else:
                tmp += " "
        nums = tmp.split()
        num = nums[0]
        lst = inp.split(num)
        return [lst[0], num, lst[1]]

    parts_0 = [divide_s(f) for f in files]

    # HEAD, NUMBER 기준으로 정렬
    parts_1 = sorted(parts_0, key = lambda x:(x[0].lower(), int(x[1])))
    answer = ["".join(i) for i in parts_1]
    
    return answer

먼저 입력을 HEAD, NUMBER, TAIL로 나누는 함수(divide_s)를 정의하였고, 그 후에 sorted를 이용하여 특정 기준으로 정렬하였다.

 

테스트 13, 20번이 실패...

다시 문제를 읽어보니, 아래와 같은 조건이 있었다.

  • TAIL은 그 나머지 부분으로, 여기에는 숫자가 다시 나타날 수도 있으며, 아무 글자도 없을 수 있다.

즉, "F-0002500 Freedom 002Fighter"와 같은 문자열이 있을 수 있다는 것이다.

위의 코드로는 아래와 같이 되므로 오답이다.

HEAD = "F-", NUMBER = "0002500", TAIL = "Freedom 002Fighter"

위의 문자열을 올바르게 나누면 다음과 같다.

HEAD = "F-", NUMBER = "00025", TAIL = "00Freedom 002Fighter"

 

위의 조건을 적용하여 다음과 같이 코드를 수정하였고, 모두 통과할 수 있었다.

def solution(files):
    # HEAD, NUMBER, TAIL로 나누는 함수 정의
    def divide_s(inp):
        tmp = ""
        for i in inp.lower():
            if i.isdigit():
                tmp += i
            else:
                tmp += " "
        nums = tmp.split()
        num = nums[0][:5]
        idx = inp.index(num)
        return [inp[:idx],inp[idx:idx+len(num)],inp[idx+len(num):]]

    parts_0 = [divide_s(f) for f in files]

    # HEAD, NUMBER 기준으로 정렬
    parts_1 = sorted(parts_0, key = lambda x:(x[0].lower(), int(x[1])))
    answer = ["".join(i) for i in parts_1]
    return answer

반응형