안녕하세요. 박기린 입니다.
백준 15552번 문제를 풀어봅시다.
문제 링크
https://www.acmicpc.net/problem/15552
문제 해석
해당 알고리즘이 요구하는 계산은 매우 간단합니다.
첫 번째 줄의 5는 테스트 케이스의 개수를 뜻하기 때문에 무시하고, 두 번째 줄부터 나오는 두 숫자를 더해준 후 출력하면 됩니다.
다만, 한 가지 중요한 조건이 붙습니다.
이 문제는 시간제한이 빡빡합니다.
풀이 자체는 맞게 하더라도, 시간 초과로 문제를 틀릴 수 있습니다.
백준 사이트에 적힌 문제에는 시간 초과 문제를 해결할 힌트를 제공해주고 있지만, NodeJS에 대한 힌트는 없습니다. 그러면 NodeJS에서는 어떻게 해야 할까요?
정답 코드
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const [count, ...arr] = input;
let result = "";
for (let i = 0; i < count; i++) {
const item = arr[i].split(" ").map((e) => parseInt(e));
// console.log(item[0] + item[1]) <- 하나씩 console 찍으니까 오래 걸린다.
// 한 번에 모아서 하나의 console로 찍어내자.
result += `${item[0] + item[1]}\n`;
}
console.log(result);
정답 코드 풀이
NodeJS에서 시간 초과를 해결하기 위한 핵심은 두 가지에 있습니다.
1. fs모듈을 사용합니다.
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const [count, ...arr] = input;
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
백준 사이트에서 NodeJS를 사용하는 경우 'readline' 모듈 사용을 권장한다는 공지가 있긴 합니다. 하지만 현재 (2023.2.24 기준) fs 모듈이 정상적으로 잘 작동합니다. readline 모듈은 fs 모듈에 비해 소요시간이 더 많이 걸리기에, fs 모듈을 사용합니다.
+ 팁) 첫째 줄이 '테스트 케이스의 개수'이고 그 다음 줄부터 '테스트 케이스'인 경우, input 값을 배열 비구조화해서 풀이하면 간단하고 좋습니다.
2. 결과값을 하나로 뭉쳐서 출력합니다.
let result = "";
for (let i = 0; i < count; i++) {
const item = arr[i].split(" ").map((e) => parseInt(e));
result += `${item[0] + item[1]}\n`;
}
console.log(result);
for (let i = 0; i < count; i++) {
const item = input[i].split(' ').map(e => parseInt(e));
console.log(item[0] + item[1]);
}
첫 번째 코드와 두 번째 코드의 차이에서 소요 시간의 차이가 발생합니다.
첫 번째 코드는 result라는 변수를 두고, 그 안에 결과값을 붙인 다음, 한 번에 출력합니다.
두 번째 코드는 결과값이 나올 때마다 console.log()를 불러와서 출력합니다.
console.log()를 부르는 횟수가 많아지면, 그만큼 실행 소요 시간 또한 길어집니다. 그래서 첫 번째 코드처럼 한 변수에 결과값을 싹 저장한 후, 한 번에 출력해주는 방식을 사용하면 좋습니다.
'JS > 백준' 카테고리의 다른 글
[백준JS] 10809. 알파벳 찾기 (0) | 2023.03.17 |
---|---|
[백준JS] 1152. 단어의 개수 (반례 설명 포함) (0) | 2023.03.15 |
[백준JS] 11654. 자바스크립트 아스키 코드 출력하기 (ASCII) (0) | 2023.03.14 |
[백준JS] 10811. 바구니 뒤집기 (0) | 2023.03.12 |
[백준JS] 10810. 골 넣기 (2) | 2023.03.11 |