문제
https://school.programmers.co.kr/learn/courses/30/lessons/17686
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
단순한 문자 코드 순이 아닌, 파일명에 포함된 숫자를 반영한 정렬 기능을 구현하려고 한다.
파일명은 100 글자 이내, 영문 대소문자, 숫자, 공백, 마침표, 빼기 부호("-")만으로 이루어지고 영문자로 시작하며 숫자를 하나 이상 포함한다.
파일명은 HEAD, NUMBER, TAIL로 이루어진다.
- HEAD: 숫자가 아닌 문자로 이루어져 있으며, 최소 한 글자 이상이다.
- NUMBER: 한 글자에서 최대 다섯 글자의 연속된 숫자로 이루어져 있으며, 앞에 0이 올 수 있다.
- TAIL: HEAD, NUMBER를 제외한 나머지 부분으로 숫자가 다시 나타날 수 있으며, 아무 글자도 없을 수 있다.
파일명은 다음 기준에 따라 정렬된다.
- 우선 HEAD를 기준으로 사전순 정렬한다. 이때 대소문자를 구분하지 않는다.
- HEAD가 대소문자 차이 외에 같을 경우, NUMBER의 숫자 순으로 정렬한다. 이때, 숫자 앞의 0은 무시된다.
- HEAD와 NUMBER가 같을 경우, 원래 입력에 주어진 순서를 유지한다.
풀이
주어진 기준에 따라 정렬하기 위해 파일명을 HEAD, NUMBER, TAIL로 분리하는 작업이 필요하다.
우선 `tokens` 배열에 `[HEAD, NUMBER, TAIL]` 형태의 배열로 쪼갠 토큰 배열을 담아주었다.
토큰화할 땐 정규표현식을 사용했다. `match` 메서드를 처음 활용해보았다. `match` 메서드는 문자열에서 인자로 넘긴 정규표현식에 매치되는 부분을 검색한다. 정규표현식이 아니라 문자열이나 숫자를 넘길 경우, 내부적으로 정규표현식으로 변환하기도 한다. 일치하는 문자열을 발견하면, 일치하는 문자열을 배열에 담아 반환한다. 정규식에 `g` 플래그가 없으면 `RegExp.exec` 메서드와 같은 결과를 반환한다.
토큰화가 끝나면, 토큰화된 문자열을 토큰을 기준으로 정렬한다. 이때 주의할 점은 12나 012나 0은 무시되고 동일한 숫자로 취급된다는 점이다. JS에서 앞에 0이 포함된 문자열을 숫자로 변환하면, 앞의 0은 제거된다. 이 점을 이용해 토큰을 숫자로 변환하여 비교해준다.
코드
function solution(files) {
// 파일명을 HEAD, NUMBER, TAIL로 분리
// 주어진 조건에 따라 파일명을 정렬
const tokens = [];
for (const file of files) {
const HEAD = file.split(/\d/)[0];
const NUMBER = file.match(/\d+/)[0];
const TAIL = file.substring((HEAD + NUMBER).length);
tokens.push([HEAD, NUMBER, TAIL]);
}
tokens.sort((a, b) => {
if (a[0].toLowerCase() !== b[0].toLowerCase()) return a[0].localeCompare(b[0]);
return Number(a[1]) - Number(b[1]);
})
return tokens.map(token => token.join(""));
}'Problem Solving > 프로그래머스' 카테고리의 다른 글
| [프로그래머스/JavaScript] 소수 찾기 (1) | 2025.07.18 |
|---|---|
| [프로그래머스/JavaScript] 프렌즈4블록 (0) | 2025.07.03 |
| [프로그래머스/JavaScript] 주차 요금 계산 (0) | 2025.07.01 |
| [프로그래머스/Java] 다트 게임 (2) | 2025.05.30 |
| [프로그래머스/Java] 압축 (0) | 2025.05.30 |
