다음과 같이 쉼표로 구분된 단어 문자열이 있다고 가정해 보겠습니다.
const str = 'JAY, ROB';
우리는 이러한 문자열을 입력받아 처리하는 JavaScript 함수를 작성해야 합니다. 이 함수는 문자열에 포함된 단어들의 알파벳을 서로 비교하여, 매 순간 선택 가능한 글자 중 사전순으로 가장 앞서는 문자를 차례대로 이어 붙여 새로운 단어를 만듭니다.
예를 들어 위 문자열에서는 먼저 JAY의 첫 번째 글자와 ROB의 첫 번째 글자를 비교합니다.
J가 R보다 사전순으로 앞서므로 새 단어의 첫 번째 알파벳은 J가 됩니다. 다음으로 두 번째 글자들을 비교하면 A가 R보다 앞서므로 두 번째 자리에는 A가 배치되고, 같은 방식으로 세 번째 자리에는 R이 옵니다.
따라서 최종적으로 완성되는 단어는 'JAROBY'입니다.
참고로 이 예제에서는 두 개의 단어만 있는 문자열을 사용했지만, 실제로는 세 개 이상의 단어가 포함된 문자열에서도 정상적으로 동작하는 범용적인 솔루션을 작성해야 합니다.
구현 예제
이를 구현한 코드는 다음과 같습니다.
const str = `JAY,ROB,APPLE,AAKO`;
const specialSort = (str = '') => {
let len = str.replace(/,/g, "").length;
const sorter = (str, b) => {
if(str === "" || str === null) return 1;
if(b === "" || b === null) return −1;
if(str === b) return 0;
return str < b ? −1 : 1;
};
let res = "";
let sorted = str.split(",").sort(sorter);
while (res.length < len){
res += sorted[0][0];
sorted[0] = sorted[0].slice(1);
sorted = sorted.sort(sorter);
}
return res;
};
console.log(specialSort(str));
코드 동작 원리
이 코드의 핵심 로직은 다음 세 단계로 요약할 수 있습니다.
1. 전체 글자 수 계산: 문자열에서 쉼표를 모두 제거한 뒤 전체 알파벳 개수를 미리 구해 둡니다. 이 값은 결과 문자열이 완성되었는지 판단하는 반복문의 종료 조건으로 사용됩니다.
2. 사용자 정의 정렬 함수: sorter 함수는 빈 문자열이나 null 값을 항상 배열의 뒤쪽으로 보내고, 그 외의 경우에는 사전순으로 크기를 비교하는 정렬 기준을 제공합니다.
3. 반복 병합: 문자열을 쉼표 기준으로 분리한 뒤 정렬하고, 정렬된 배열의 첫 번째 단어에서 한 글자씩 잘라내어 결과 문자열에 이어 붙입니다. 글자를 하나 소비할 때마다 배열을 다시 정렬함으로써, 항상 가장 작은 첫 글자를 가진 단어가 맨 앞에 위치하도록 유지합니다.
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
AAAJAKOPPLEROBY