티스토리 뷰

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

 

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

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

programmers.co.kr

입력: ["img12.png", "img10.png", "img02.png", "img1.png", "IMG01.GIF", "img2.JPG"] 

출력: ["img1.png", "IMG01.GIF", "img02.png", "img2.JPG", "img10.png", "img12.png"]

 

HEAD(문자열), NUMBER(숫자), TAIL(없을수도 있음) 로 이루어진 문자열을 정렬 해서 반환해주는 함수를 만들어주면 된다.

  1. 리스트를 순회 하며 하나의 문자열을 HEAD, NUMBER 로 나눈다.
  2. HEAD를 기준으로 정렬, HEAD가 같으면 NUMER로 정렬 한다.
  3. 반환

1번 나누는 부분이 핵심인 문제이다.

이 코드에서는  name = re.split('(\d+)', name) 과 같이 나눴다.  re.split 은 문자열에서 패턴이 맞으면 이를 기점으로 리스트로 쪼개는 함수이다. "img12.png" 를 위와 같이 나눌경우 ["img", "12", ".png"]  와 같이 리스트로 분리되어 나온다. 문제에서

HEAD는 숫자가 아닌 문자로 이루어져 있으며, 최소한 한 글자 이상이다.
NUMBER는 한 글자에서 최대 다섯 글자 사이의 연속된 숫자로 이루어져 있으며 

라는 조건이 있기 때문에 숫자로 나누면 HEAD 와 NUMER를 확실히 나눌 수 있다. 이렇게 나눈 후 세부 조건을 보면

파일명은 우선 HEAD 부분을 기준으로 사전 순으로 정렬한다. 이때, 문자열 비교 시 대소문자 구분을 하지 않는다. MUZI와 muzi, MuZi는 정렬 시에 같은 순서로 취급된다. 

-> HEAD.upper()를 사용하여 모두 대문자로 만든 후 비교해 준다. lower() 또한 가능하다. 

파일명의 HEAD 부분이 대소문자 차이 외에는 같을 경우, NUMBER의 숫자 순으로 정렬한다. 9 < 10 < 0011 < 012 < 13 < 014 순으로 정렬된다. 숫자 앞의 0은 무시되며, 012와 12는 정렬 시에 같은 같은 값으로 처리된다.

-> NUMER를 int() 함수를 사용하여 int형태로 바꾸어 비교한다. 0123 -> 123으로 자동으로 변환 된다.

두 파일의 HEAD 부분과, NUMBER의 숫자도 같을 경우, 원래 입력에 주어진 순서를 유지한다. MUZI01.zip과 muzi1.png가 입력으로 들어오면, 정렬 후에도 입력 시 주어진 두 파일의 순서가 바뀌어서는 안 된다.

-> <= 연산자가 아닌 < 연산자를 써주어 같을 경우에는 바꾸지 않도록 한다.

 

 

import re
from functools import cmp_to_key

def compare(i1,i2):
    name1 = re.split('(\d+)', i1)
    name2 = re.split('(\d+)', i2)
    name1[0] = name1[0].upper()
    name2[0] = name2[0].upper()
    name1[1] = int(name1[1])
    name2[1] = int(name2[1])
    
    if name1[0] < name2[0]:
        return -1
    elif name1[0] == name2[0]:
        if name1[1] < name2[1]:
            return -1
        else:
            return 1
    else:
        return 1
def solution(files):
    result = sorted(files,key=cmp_to_key(compare))
    return result
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함