코딩 테스트/프로그래머스

Lv2. [3차] 파일명 정렬

  • -
728x90
반응형

문제 보기 :  [3차] 파일명 정렬

 

프로그래머스

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

programmers.co.kr


문제

  • 정답률 : 57%


작성 코드

def solution(files):
    new_files = {i:[] for i in files}
    num = [str(i) for i in range(10)] #["0","1",....,"9"]

    for file in files:
        a = [] ; turn = 0
        ff = file.lower()
        j = ''
        
        for f in range(len(ff)):
            if ff[f] not in num:
                j += ff[f]
            else:
                a.append(j)
                j = ''
                break
        # 숫자가 하나 이상 있으므로 항상 분리될 것임
        
        for nf in range(f,len(ff)):
            if ff[nf] in num:
                j += ff[nf]
                if nf == len(ff)-1:
                    a.append(int(j))
                    left = 0
            else:
                a.append(int(j))
                left = 1
                break
        if left == 1:
            a.append(ff[nf:])
        new_files[file] = a
    
    new_files = sorted(new_files.items(), key=lambda x:(x[1][0],x[1][1]))
    new_files = dict(new_files)
    return list(new_files.keys())

풀이

어려우면서도 쉬운 문제다. 우리가 많이 사용하는 <파일 탐색기>에서 파일을 정렬하는 알고리즘을 구현하는 문제라고 할까나..?

어렵게 느낀 이유는 문자열이 여러개 있고, 여기에서 문자로 인식되고 있는 숫자만 골라내야 한다는 것이었다. 시간 복잡도를 고려하지 않을 수 없기에 이중 for문을 넘어선 삼중, 사중은 피하고 싶었다.. 

해결과정은 이랬다.
먼저 0~9까지의 숫자를 문자열로 담는 리스트를 만들고, 원본 문자열을 key로 갖는 딕셔너리로 하나 만들어두었다.
문자열의 대소문자는 구분하지 않는다 하여 전체를 소문자로 변경했다. 

모든 문자열에는 숫자가 있다는 조건이 있어서 무조건 깨지는 for문을 하나 만들어서, 숫자가 등장하기 전까지의 단어를 분리했다.
분리한 단어는 a에 입력하고, 다음의 for문을 통해 숫자 부분을 골라낸 뒤, a에 한번 더 int로 입력했다.
그리고 뒷 부분이 남아있으면 tail 부분을 채우고, 없으면 채우지 않았다.

이 과정을 통해 나온 a는 처음에 만들어두었던 딕셔너리에 입력했다.

for문이 끝나면 딕셔너리 value의 0번째, 1번째 원소로 정렬시킨 뒤 딕셔너리의 key를 정답으로 두어 출력했다 .

320x100
728x90

'코딩 테스트 > 프로그래머스' 카테고리의 다른 글

Lv1. 로또의 최고 순위와 최저 순위  (0) 2024.09.26
Lv3. 등굣길  (0) 2024.09.24
Lv2. 오픈채팅방  (0) 2024.09.24
Lv2. 2 x n 타일링  (0) 2024.09.22
Lv2. 가장 큰 수  (0) 2024.09.21
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.