PS(Javascript)

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

같이긍뱅와 2023. 1. 28. 00:28
function solution(files) {
    const re = /^[a-zA-Z-\. ]+|[0-9]+/g;
    const dict = [];
    files.forEach((file, idx) => {
        const [name, num] = file.match(re);
        dict.push({file, name: name.toLowerCase(), num: parseInt(num), idx});
    });
    return dict.sort((a, b) => { 
        if (a.name > b.name) return 1
        if (a.name < b.name) return -1
        if (a.num > b.num) return 1
        if (a.num < b.num) return -1
        return a.idx - b.idx
    }).map(e => e.file)
}

정규표현식을 활용하면 수월하게 풀 수 있는 문제이다. 

^[a-zA-Z-\. ]+  => 알파벳, -, ., 또는 공백으로 시작하는 문자를 하나이상 (첫번째 정렬대상)

|   => 또는

[0-9]+ => 숫자로 된 문자를 하나 이상(두번째 정렬대상)

g를 사용하여 조건을 만족하는 것을 모두 찾는다

 

답을 구할 때는 첫번째와 두번째 정렬 대상만 고려하면 되는데 

g를 사용하였기 때문에 뒤에 숫자가 또 나올 수 있지만 

file.match(re)가 리턴하는 배열을 destructuring 하여서 0, 1번

인덱스의 문자열만 name과 num에 담아 준다. 

 

그 뒤는 정렬에서 고려하지 않는다 다만 순서는 유지 시켜주어야한다. 

따라서 idx를 dict에서 따로 저장하여 위의 name과 num이 모두 같은 경우에는 

idx 순으로 오름차순 정렬을 유지해 줄 수 있게 하였다.

오름차순 정렬을 좀더 명확하게 명시하기 위하여 따로 idx를 두긴 하였으나

사실 idx는 default가 오름차순이라 마지막 return a.idx - b.idx는 빼도 답은 똑같이 나온다.