Node.js로 백준 문제 풀이시 입력 처리
문제
Javascript로 알고리즘 공부를 하는 것은 처음이라 시작하기전에 입출력 방법을 공부하고 시작했었습니다. 전에 다른 언어로 풀었던 문제들도 다시 풀어보면서 공부하던 중 1259번 문제(팰린드롬 수)를 풀기 시작했습니다.
저는 이번에 Javascript로 알고리즘을 풀기 시작하면서 github에 기록을 남겨두기위해 vscode를 쓰면서 문제를 풀었는데요. 제가 처음에 작성한 코드는 아래와 같습니다.
// 1259.txt
121
1231
12421
0
const input = require('fs')
.readFileSync('baekjoon/1000~/1259.txt') // 1259.txt는 백준의 입력 예시가 똑같이 저장된 파일입니다.
.toString()
.split('\n');
const arr = input.filter((e) => e !== '0');
arr.forEach((e) => {
let reverse = e.split('').reverse().join('');
console.log(reverse.trim() === e.trim() ? 'yes' : 'no');
})
마지막 console.log()
에서 reverse
와 arr.[i]
에 trim()
을 한 이유는 개행문자 때문에 모든 결과가 no로 출력되어서 개행문자 제거를 위해 추가한 것입니다.
vscode에서의 실행결과는 yes\n no\n yes
로 올바르게 실행되었고 저는 이 코드를 제출했습니다.
결과는 틀렸습니다
였습니다..
저는 제 알고리즘에서 틀렸다고 생각해서 수정 후에 여러 번 제출을 해봤지만 계속 틀렸습니다
만 확인할 수 있었습니다. 결국 마지막 제출도 틀린것을 확인하고 구글링으로 정답자분의 코드를 복사해서 제 코드와 비교해보며 공부하기로 하고 한 가지 코드를 복사해왔습니다.
해결
let fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n"); // (1)
input.pop();
// (2)
for (let i = 0; i < input.length; i++) {
let reverseStr = input[i].split("").reverse().join("");
console.log(input[i] === reverseStr ? "yes" : "no"); // (3)
}
제 코드와 아래 코드를 비교했을 때 차이점은
(1) input에서 trim()
을 한다는 것
(2) for
와 forEach()
를 사용해 배열을 순회한다는 것
(3) 마지막 삼항연산자에서 trim()
을 사용하지 않는다는 것이었습니다.
저는 아래쪽의 알고리즘의 차이가 아닌 (1), (3)에 초점을 맞춰서 코드를 수정했습니다.
const input = require('fs')
.readFileSync('baekjoon/1000~/1259.txt')
.toString()
.trim() // 새로 추가된 부분
.split('\n');
...
arr.forEach((e) => {
let reverse = e.split('').reverse().join('');
console.log(reverse === e ? 'yes' : 'no'); // trim() 제거
})
vscode의 출력 결과로는 no\n no\n no
가 나와서 틀린 줄 알았지만 혹시나 싶어서 백준에 제출했을 때에는 정답입니다
가 나왔습니다.
여기서 저는 두 가지 의문이 생겼습니다.
- 위 코드에서 trim()을 다시 제거하고 제출하면
틀렸습니다
인데 무슨 차이인걸까? - 마지막
console.log()
의 삼항연산자에서 개행문자의 존재는 큰 영향을 미치지 않는 것인가?
1번은 해결했지만 2번은 아직 이유를 모르겠습니다.
1번의 이유는 구글링으로 알게됐는 데, 백준의 입력 마지막에 개행문자가 종종 추가되는 경우가 있으므로 trim()
을 사용하는 것이 좋다는 것이었습니다.
문제의 입력예시에는 그렇지 않았지만 제출했을 때 입력으로 주어지는 경우에는 있을 수도 있다는 것을 이번 문제를 통해 알 수 있었습니다. (입력 예시를 무조건 믿지 말자)
혹시 2번의 경우 왜그런지 아시는 분은 댓글 부탁드립니다.
Author And Source
이 문제에 관하여(Node.js로 백준 문제 풀이시 입력 처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@circlewee/Node.js로-백준-문제-풀이시-팁저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)