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

FFTL:)·2021년 11월 26일
0

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

구현과 정렬의 문제였습니다. 크게 어렵지는 않았던 문제였던 것 같습니다.

풀이

  • 일단 설명에 의하면 HEAD의 우선순위에서 대문자 소문자는 구분하지 않는다고 했습니다. 그래서 저는 소문자로 모두 변경하여 정렬하기 용이하도록 하였습니다.

  • NUMBER의 영역을 찾아주기 위해서 문자열을 for문으로 돌렸습니다. 첫번째로 숫자가 나오는 인덱스를 num_start에 담아주고, num_start가 0이 아니며 숫자가 아닌 문자가 나왔을 때에를 num_end로 담아주어 NUMBER부분을 찾아내었습니다. ( 그리고 TAIL이 없을 경우 NUMBER가 완성되지 못하는데 이럴 때에는 num_start 부터 문자열 끝까지를 NUMBER라고 인식하도록 하였습니다. )

  • 그리고 뒤의 마지막 부분이 TAIL인데 TAIL은 정렬에 영향을 주지 않기 때문에 중요하지 않았으며 HEAD와 NUMBER까지 동일하다면 처음 담겨있던 인덱스 순으로 정렬을 해야하기 때문에 처음 인덱스도 함께 담아주었습니다.

  • 이렇게 정보를 모두 담아놓은 data를 파이썬의 lambda 정렬을 이용해서 답을 찾아내었습니다.

code

#영어를 소문자로 통일
#숫자가 나오기 시작하면 NUMBER
#숫자가 끝난뒤에는 전부 TAIL

def solution(files):
    answer = [];
    data = [];
    
    for i in range(len(files)):
        now = files[i].lower();
        number = "";
        file_name = "";	#HEAD를 담아줄 변수입니다.
        num_start = 0;	#NUMBER 부분 시작점
        num_end = 0;	#NUMBER 부분 끝점
        
        for j in range(len(now)):
        	#이번 문자가 숫자이며 num_start가 0일 떄 이 부분이 NUMBER 시작점 입니다.
            if num_start == 0 and now[j].isdigit():
                num_start = j;
                file_name = now[:num_start];	#NUMBER 시작점 전까지가 HEAD의 영역입니다.
            #num_start를 찾았고 그다음에 숫자가 아닌 문자가 나오면 NUMBER 끝점을 찾았습니다. num_start ~ num_end로 NUMBER를 찾아 담아줍니다.
            elif num_start != 0 and not now[j].isdigit():
                num_end = j;
                number = now[num_start:num_end];
                break;
                
        #만약 TAIL이 없다면 위의 elif 에서 number을 완성하지 못합니다.
        #그래서 직접 만들어 줍니다.
        if number == "":
            number = now[num_start:];
        
        data.append([i, files[i], file_name, int(number)]);
    
    #lambda를 이용한 정렬으로 요구사항대로 정렬해 줍니다.
    data.sort(key = lambda x : (x[2], x[3], x[0]));
            
    for d in data:
        answer.append(d[1]);
        
    return answer;
profile
생각하는 개발자가 되자!

0개의 댓글