자세한 문제 설명은 👉 프로그래머스 - 카카오 3차 블라인드 코딩테스트
파일명 = {
HEAD: 숫자가 아닌 문자로 이루어져 있고 최소 한 글자 이상(대소문자,
특수문자),
NUMBER: 1개 ~ 5개 사이의 연속된 숫자로 이루어져 있고 앞쪽에 0이 올 수 있음,
TAIL: 나머지 부분으로 숫자가 다시 나타날 수 있고 빈 문자열이 될 수 있음
}
sort()
를 재정의하여 푼다.sort()
를 재정의하므로 두 요소의 각 Head와 Number를 비교하여 정렬한다.function solution(files) {
return files.sort((a, b) => { // sort() 함수 사용
const headA = a.match(/^\D+/)[0].toLowerCase();
// ^: 시작을 의미, \D: 숫자를 제외한 모든 문자, +: 하나 혹은 여러개를 의미
// /^\D+/: 숫자를 제외한 모든 문자로 시작하며 그 문자열이 하나 혹은 여러개를 골라내는 정규표현식
// match() 함수를 통해 위 정규표현식과 매치하는 부분을 골라낸 후
// 비교하기 편하게 소문자로 치환
// (match()의 리턴값은 배열이고 0번째에 정규표현식으로 걸러낸 문자열이 담겨있다)
const headB = b.match(/^\D+/)[0].toLowerCase();
// 위와 동일함
if(headA < headB) return -1;
// headA보다 headB가 크면 headA가 더 앞에 온다는 뜻이므로
// 음수 리턴 (순서 바꾸지 않는다는 뜻)
else if(headA > headB) return 1;
// 위와 반대
const numberA = a.match(/\d+/)[0].replace(/^0+/, "");
// \d: 숫자만 포함
// /\d+/: 숫자로 시작하며 그 문자열이 하나 혹은 여러개를 골라내는 정규표현식
// /^0+/: 0으로 시작하며 그 문자열이 하나 혹은 여러개를 골라내는 정규표현식
// match() 함수를 통해 위 정규표현식과 매치하는 부분을 골라낸 후
// 0으로 시작하면 빈 문자열로 치환
const numberB = b.match(/\d+/)[0].replace(/^0+/, "");
// 위와 동일함
return numberA - numberB;
})
}