반응형
문제 출처
https://school.programmers.co.kr/learn/courses/30/lessons/17686
문제 풀이 힌트
- 파일명을 나누기 세 부분으로
- 그래서 head 기준으로 순서 정하고 (사전순)
- number 순으로 순서 정하고 (앞 0 빼고, 숫자 크기 오름차순)
- 그마저도 같을 때 기존 순서 유지
정답 풀이 코드
function solution(files) {
return files.sort((a, b) => {
// a와 b의 head 부분을 정규 표현식을 사용해 추출하고 소문자로 변환
const headA = a.match(/\D+/)[0].toLowerCase();
const headB = b.match(/\D+/)[0].toLowerCase();
// headA와 headB를 비교하여 정렬 순서를 결정
if (headA < headB) return -1;
if (headA > headB) return 1;
// head가 같을 경우, a와 b의 number 부분을 정규 표현식을 사용해 추출하고 앞의 0을 제거
const numA = a.match(/\d+/)[0].replace(/^0+/, '');
const numB = b.match(/\d+/)[0].replace(/^0+/, '');
// number를 비교하여 정렬 순서를 결정
return numA - numB;
});
}
Only 풀이 코드
function solution(files) {
return files.sort((a,b) => {
const headA = a.match(/\D+/)[0].toLowerCase()
const headB = b.match(/\D+/)[0].toLowerCase()
if(headA < headB) return -1;
if(headA > headB) return 1;
const numA = a.match(/\d+/)[0].replace(/^0+/,'')
const numB = b.match(/\d+/)[0].replace(/^0+/,'')
return numA-numB;
})
}
다른 풀이 코드 1
위 코드랑 거의 같은데, 구조만 바꿔줬다.
function solution(files) {
return files.sort((a,b) => {
const headA = a.match(/\D+/)[0].toLowerCase();
const headB = b.match(/\D+/)[0].toLowerCase();
if(headA === headB){
const numberA = a.match(/\d+/)[0].replace(/^0+/,'');
const numberB = b.match(/\d+/)[0].replace(/^0+/,'');
return numberA - numberB;
}else{
if(headA < headB) return -1;
if(headA > headB) return 1
}
})
}
다른 풀이 코드 2
function solution(files) {
return files.sort((a,b) => {
const headA = a.match(/\D+/)[0].toLowerCase();
const headB = b.match(/\D+/)[0].toLowerCase();
if(headA === headB){
const numberA = a.match(/\d+/)[0].replace(/^0+/,'');
const numberB = b.match(/\d+/)[0].replace(/^0+/,'');
return numberA - numberB;
}else{
return headA.localeCompare(headB) //이 부분이 다름
}
})
}
알고가는 ppoint
1. match
str.match(regexp)
regexp에 일치하는 문자열을 첫번째 요소로 포함하는 `Array`를 반환한다.
2. replace
문자열에서 변경하려는 문자열이 여러번 반복된 경우,
첫번째로 발견한 문자열만 치환
let str = 'apple,banana,banana'
let answer = str.replace('banana','tomato')
console.log(answer)
//'apple,tomato,banana'
대소문자 구분없이 모든 문자열 치환
let str = 'apple,Banana,orange,banana'
let answer = str.replace(/banana/gi, 'tomato')
console.log(answer);
//'apple,tomato,orange,tomato'
3. sort할 때 앞에 return 붙여야 하는 이유
4. charCodeAr()
5. a.localeCompare(b)
6. 문자열 오름차순 sort일 때 return -1, 1에 대해서 헷갈림
반응형
'알고리즘 문제 풀기' 카테고리의 다른 글
프로그래머스: 메뉴 리뉴얼- javascript(재귀 이용한 조합, 객체) (0) | 2024.04.14 |
---|---|
프로그래머스: [1차]프렌즈4블록 - javascript(그래프 이동, concat) (0) | 2024.04.13 |
프로그래머스: 오픈채팅방 - javascript(replace, Map, switch) (0) | 2024.04.09 |
프로그래머스: [3차] N진수 게임 - javascript(toString, toUpperCase()) (0) | 2024.04.08 |
프로그래머스: 키패드 누르기 - javasript(구현, Math.abs, 숫자 규칙) (0) | 2024.04.06 |