프로그래머스 : 파일명 정렬
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++을 사용했기 때문에 문자열에 대한 여러 가지 함수를 찾고, 공부하는데 시간을 들였던 것 같습니다.
'알고리즘 문제풀이 > 프로그래머스' 카테고리의 다른 글
멀쩡한 사각형 / js 풀이 (0) | 2021.06.29 |
---|---|
신규 아이디 추천 / js 풀이 (0) | 2021.06.23 |
폰켓몬 / js 풀이 (0) | 2021.06.22 |
K번째수 / js 풀이 (0) | 2021.06.21 |
로또의 최고 순위와 최저 순위 / js 풀이 (0) | 2021.06.18 |