알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
조건에 따라 정렬하여 단어들을 출력한다.
// let input = require('fs').readFileSync('/dev/stdin').toString().split('\n');
let input = [13,`but`,`i`,`wont`,`hesitate`,`no`,`more`,`no`,
`more`,`it`,`cannot`,`wait`,`im`,`yours`];
let [N, ...arr] = input;
let lengthArr = [];
let answer = [];
for(let i=0; i<N; i++){
lengthArr.push(arr[i].length)
};
let maxLength = Math.max(...lengthArr);
for(let i=1; i<=maxLength; i++){
// 길이가 짧은 순서대로
let idx = lengthArr.indexOf(i);
let idxArr = [];
while(idx !== -1){
idxArr.push(idx);
idx= lengthArr.indexOf(i, idx+1)
};
let sortArr = [];
for(let j=0; j<idxArr.length; j++){
// 중복제거
if(sortArr.includes(arr[idxArr[j]])!==true){
sortArr.push(arr[idxArr[j]])
}
};
// 사전순 정렬
sortArr.sort();
answer.push(...sortArr)
}
console.log(answer.join('\n'))
단어 길이를 구하고 짧은 순서대로 모아서 중복이 없도록 사전순으로 정렬해서 답을 구했다.
깔끔한 풀이는 아닌 것 같음... 다른 사람 풀이도 찾아봐야겠다.
++
찾아보니 new Set으로 중복제거하고 다시 array로 바꾼 후
sort()로 사전순 정렬한 뒤에
sort((a,b)=>a.length-b.length)로 풀이하면 간단하게 풀이할 수 있네...