백준 1181번 단어정렬-JS

yugyeongKim·2021년 12월 1일
0

백준

목록 보기
42/52
post-custom-banner

- 내가 푼 풀이(실패)

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split(/\r\n|\r|\n/);
let N = Number(input.shift());
let set = new Set(input);
let arr = [...set];
let numArr = [];
let matchArr = new Array(N);
matchArr.fill('');
// for(let i=0; i < arr.length; i++) {
//     let num = arr[i].trim().split('');
//     numArr.push(num.length);
// }
// let maxWordNum = Math.max.apply(null, numArr);
// let minWorNum = Math.min.apply(null, numArr);
for(let i=0; i < arr.length; i++) {
    matchArr[arr[i].trim().split('').length-1] += arr[i] + ' ';
}

matchArr = matchArr.filter(function(item) {
    return item !== '';
})

let answer = '';
let wordsArr = [];
for(let i=0; i < matchArr.length; i++) {
    let word = matchArr[i].split(' ');
    // word = word.filter(function(item) {return item !== '';})
    // console.log(word);
    word.pop();
    if(word.length > 1) {
        wordsArr.push(word.sort());
    } else {
        wordsArr.push(word);
    }
    // console.log(word);
}

// console.log(wordsArr);
wordsArr.forEach(element => {
    for(let i=0; i < element.length; i++) {
        answer += element[i] + '\n';
    }
});
console.log(answer);
  1. 중복을 제거한 배열 생성
  2. 단어의 길이-1에 해당하는 인덱스에 해당 단어를 넣는다.
  3. 그 배열의 길이가 1이상일 때 sort를 이용해 정렬 후 최종 배열에 넣은 후 출력

왜 안되는건지 모르겠다. 다른 영단어로 많이 바꿔도 다 잘나왔는데 왜?

- 최종코드

와 드디어 알았다. 역시 나빼고 다 천재. 질문 게시판에 올리기 잘했다.

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split(/\r\n|\r|\n/);
let N = Number(input.shift());
let set = new Set(input);
let arr = [...set];
let numArr = [];
let matchArr = new Array(50);
matchArr.fill('');

for(let i=0; i < arr.length; i++) {
    matchArr[arr[i].trim().split('').length-1] += arr[i] + ' ';
}

matchArr = matchArr.filter(function(item) {
    return item !== '';
})

let answer = '';
let wordsArr = [];
for(let i=0; i < matchArr.length; i++) {
    let word = matchArr[i].split(' ');
    word.pop();
    if(word.length > 1) {
        wordsArr.push(word.sort());
    } else {
        wordsArr.push(word);
    }
}

wordsArr.forEach(element => {
    for(let i=0; i < element.length; i++) {
        answer += element[i] + '\n';
    }
});
console.log(answer);

matchArr = new Array(N)
매치시킬 배열의 길이를 단어의 개수N만큼으로 생성한 여기가 잘못된 부분이였다. 왜냐하면 밑에 주어진 for문에서 arr배열의 요소 즉, 단어의 길이에 해당하는 수-1의 인덱스에 그 요소(단어)를 넣는 것을 수행한다. 하지만 mathArr를 단어들의 개수만큼 지정했고 arr배열의 요소인 단어의 길이는 그 개수보다 길다면? 당연히 범위가 벗어나 오류가 발생하는 것!

예를 들어 단어의 길이는 50까지 가능하니 13개의 단어들 중 한 단어의 길이가 50이라치면 matchArr는 길이가 13이 되는데 인덱스가 50인곳에 그 단어를 저장하게 되는 꼴. 이게 vscode에서는
[
'i ',
'no it ',
'but ',
'wont more wait ',
'yours ',
'cannot ',
'',
'hesitate ',
'',
'',
'',
'',
'',
<16 empty items>,
'undefinedasdfghjklzxcvbnmqwertyuiopasdf '
]
이렇게 할당이 되긴하는데 백준에서는 안되는 가보다. 그래서 애초에 가장 긴 단어의 길이인 50으로 mathArr의 길이를 지정하는 것이 맞다.

- 느낀점

무조건 할당하는 걸 input의 첫줄에 있는 것이겠거니~ 짐작해서 기계적으로 하지말고 돌아가는 것을 좀 더 생각해보고 결정하자. 문제에 주어진 제한도 주의해서 보도록 하자.

post-custom-banner

0개의 댓글