문제 - 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 정렬을 이용해서 답을 찾아내었습니다.
#영어를 소문자로 통일
#숫자가 나오기 시작하면 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;