[알고리즘]파일명 정렬

문제

문제 링크

코딩테스트 연습 - [3차] 파일명 정렬 | 프로그래머스 (programmers.co.kr)

풀이

이 문제는 풀어야하는 방향성은 알고 있는데, 정규표현식을 사용하여 더 간단하게 풀 수 있었던 문제라서 다른 사람의 풀이를 가져와 다시 풀었다.

일단 문제의 길이가 조금 긴데 축약하면 아래와 같다.

  1. 파일명을 가운에 등장하는 숫자 기준으로 3등분을 하여 head, number, tail로 분류
  2. 파일을 정렬하는데 head→number 순서대로 정렬기준이 정해진다. head는 대소문자 관계없이 사전순 정렬, head가 같을 시 number를 정렬(문자열이 아니라 숫자기준으로)

내가 문제를 풀면서 제일 고민했던 부분이 바로 1번이었다. 처음에는 그냥 문자열 순회하면서 찾으려고 했는데 그것보다는 더 간단한게 있을 것 같아서 다른 사람들의 코드를 참고해보니 정규표현식을 사용하면 매우 간단하게 절단할 수 있었다.
심지어 뒤의 tail부분은 아래에 작성하겠지만, 굳이 구할 필요도 없어서 앞부분의 문자열 부분과 중간의 숫자 부분만 한번씩 찾아주면 되서 그렇게 복잡한 식도 아니었다.(아마 tail부분을 구하는 거면 tail은 문자열과 숫자가 공존하는 포맷이라서 좀 복잡해졌을 것 같다.)

이제 문자열들을 하나씩 비교해가며 정렬을 해주면 되는데, 여기서 head, number에 대한 정렬은 기준이 정해져있는데 tail의 경우 정렬을 하지 말라고 나온다. 따라서 head와 number까지 같으면 그냥 정렬을 하지 말고 그대로 냅두면 된다.

그래서 정규표현식을 사용하여 헤드부분(/^\D+/, 첫 시작부터 문자열이 연속된 부분)과 숫자부분(/\d+/, 숫자가 연속된 부분) 중에서 제일 앞 문자열을 가져와서 비교를 진행하면 된다. 정규표현식만 잘 작성하면 그렇게 어려운 문제는 아니라고 생각한다.

코드

function solution(files) {
    return files.sort((a, b) => {

        const headerA = a.match(/^\D+/)[0].toLowerCase();
        const headerB = b.match(/^\D+/)[0].toLowerCase();

        if (headerA < headerB) {
          return -1;
        }
        if (headerA > headerB ) {
          return 1;
        }

        const numberA = a.match(/\d+/)[0].replace(/^0+/, "");
        const numberB = b.match(/\d+/)[0].replace(/^0+/, "");

        return numberA - numberB;
    });
}

좋은 웹페이지 즐겨찾기