알고리즘 문제풀이/프로그래머스

[3차] 파일명 정렬 / js 풀이

Heman 2021. 4. 23. 15:09

프로그래머스 : 파일명 정렬

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

문제풀이

문제풀이 로직은 대략적으로 다음과 같습니다.

  • files에 담긴 파일들을 각각 HEAD, NUMBER, TAIL로 분리합니다.
  • HEAD를 기준으로 비교/정렬을 수행합니다.
  • HEAD가 같다면 NUMBER를 기준으로 비교/정렬을 수행합니다.

코드

function solution(files) {
    let orderObject = files.map((name, index) => ({name, index}));
    // sort 적용시 같은 결과 값에 대해 원래 순서를 유지하기 위해 index를 추출하여 묶음

    const compare = (a, b) => {
        let regNum = /[0-9]/g;
        // 숫자 표현 정규식

        let indexA = a.indexOf((a.match(regNum))[0]);
        let indexB = b.indexOf((b.match(regNum))[0]);
        // 정규식을 활용해 숫자로 존재하는 가장 첫번째 인덱스들을 담음

        let head = (a.substring(0, indexA)).toLowerCase().localeCompare(b.substring(0, indexB).toLowerCase());
        // 숫자가 나오기 직전까지인 HEAD부분을 분리하여 정렬하는 작업

        // substring 함수를 사용해 0부터 숫자가 나오기 전까지 문자를 추출, 모두 소문자로 변환하여 비교하였다

        // 인수(localeCompare 내 파라미터 값)이 string 객체(localeCompare 앞 인자) 보다 뒤에 있으면 음수, 그 반대면 양수를 출력, 동등하면 0을 반환한다

        if(head === 0){
            // head가 같다면, number 기준으로 정렬

            let strA = parseInt(a.substring(indexA));
            let strB = parseInt(b.substring(indexB));

            if(strA > strB){
                return 1;
            }
            else if(strA < strB){
                return -1;
            }
            else {
                return 0;
            }
        }
        else if(head === 1){
            return 1;
        }
        else {
            return -1;
        }
    }

   orderObject.sort((a,b) => {
        // sort 함수 내에서 비교값이 같은 경우 원래 순서를 유지하기 위함

        let result = compare(a.name, b.name);
        return result === 0 ? a.index - b.index : result;
        // 비교값이 같으면 원래 인덱스를 유지, 아니면 결과값을 반환
    })

    return orderObject.map(ans => ans.name);
       // 결과값 매핑 
}

 

리뷰

크게 어렵지 않은 난이도의 문제였지만, javascript를 이용하여 문제를 푸는 것은 거의 처음이라 다른 블로그의 솔루션들을 참고하였습니다ㅠㅠ
이전까지는 C++을 사용했기 때문에 문자열에 대한 여러 가지 함수를 찾고, 공부하는데 시간을 들였던 것 같습니다.