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()에서 reversearr.[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) forforEach()를 사용해 배열을 순회한다는 것
(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가 나와서 틀린 줄 알았지만 혹시나 싶어서 백준에 제출했을 때에는 정답입니다가 나왔습니다.

여기서 저는 두 가지 의문이 생겼습니다.

  1. 위 코드에서 trim()을 다시 제거하고 제출하면 틀렸습니다인데 무슨 차이인걸까?
  2. 마지막 console.log()의 삼항연산자에서 개행문자의 존재는 큰 영향을 미치지 않는 것인가?

1번은 해결했지만 2번은 아직 이유를 모르겠습니다.
1번의 이유는 구글링으로 알게됐는 데, 백준의 입력 마지막에 개행문자가 종종 추가되는 경우가 있으므로 trim()을 사용하는 것이 좋다는 것이었습니다.
문제의 입력예시에는 그렇지 않았지만 제출했을 때 입력으로 주어지는 경우에는 있을 수도 있다는 것을 이번 문제를 통해 알 수 있었습니다. (입력 예시를 무조건 믿지 말자)
혹시 2번의 경우 왜그런지 아시는 분은 댓글 부탁드립니다.

참고한 글
Node.js로 백준(BOJ) 문제 풀 때 유의할 점들

좋은 웹페이지 즐겨찾기