문제
풀이
파일명이 다음과 같이 주어지며, Head, Number, Tail로 나뉜다.
조건을 나열해보면
1. Head를 기준으로 대소문자 구분을 하지 않고 사전순으로 정렬한다.
2. Head가 같다면 Number의 숫자 순으로 정렬한다. 0012와 12는 같은 값으로 처리되어야 한다.
3. Head, Number가 모두 같다면 원래 입력 순서를 유지한다.
이렇게 3가지이다.
입력으로 주어진 문자열에서 Head, Number를 발견하면 나머지는 Tail로 취급이 된다.
문자열은 영문 대소문자, 숫자, 공백, 마침표, 빼기부호만으로 이루어져있다.
Head, Number, Tail 각각에 대한 조건은 다음과 같다.
Head는 숫자가 아닌 문자로만 이루어지며 최소 한글자 이상이다.
Number는 1~5글자의 연속된 숫자이다.
Tail은 문자열에서 Head, Number를 제외한 나머지이다.
정규 표현식을 이용해 코드를 완성할 수 있겠다.
코드
function solution(files) {
const pattern = /(\D+)(\d{1,5})/;
return files.sort((a, b) => {
let [aHead, aNumber] = a.match(pattern).slice(1, 3);
let [bHead, bNumber] = b.match(pattern).slice(1, 3);
aHead = aHead.toLowerCase();
bHead = bHead.toLowerCase();
if (aHead === bHead && aNumber === bNumber) return 0;
if (aHead === bHead) return aNumber - bNumber;
if (aHead > bHead) return 1;
else return -1;
});
}
코드 설명
pattern을 이용해 2가지 그룹을 찾는다.
첫번째 그룹은 \D+ (숫자가 아닌것을 1개 이상 찾는다.)
두번째 그룹은 \d{1,5} (숫자인 것을 1개 이상 5개 이하로 찾는다.)
발견한 Head, Number를 각각 변수로 지정하고 Head를 소문자로 바꿔준다.
Head, Number를 이용해 정렬하는 조건은 3가지이며, 차례대로 조건을 구현한다.
단, if문의 조건에 부합해 return문을 만나면 더이상 코드 실행을 하지 않는 것을 고려해준다.
이에 따라서
Head, Number가 모두 같을때 => Head가 같을 때 => Head를 사전순으로 나열할 때의 순서로 조건을 작성해야 한다.
'DS & Algorithm > programmers' 카테고리의 다른 글
[프로그래머스] 압축 - 자바스크립트 (0) | 2021.06.27 |
---|---|
[프로그래머스] 영어 끝말잇기 - 자바스크립트 (0) | 2021.06.27 |
[프로그래머스] 피보나치 수 - 자바스크립트 (0) | 2021.06.19 |
[프로그래머스] 튜플 - 자바스크립트 (0) | 2021.06.19 |
[프로그래머스] 오픈 채팅방 - 자바스크립트 (0) | 2021.06.19 |