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는 빼도 답은 똑같이 나온다.