[백준/Node.js] 15552번: 빠른 A+B (실패: 시간 초과 … Node.js로 해결할 수 없음)

Min Jae Kim·2020년 3월 29일
1

제한 사항


문제

본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.

C++을 사용하고 있고 cin/cout을 사용하고자 한다면, cin.tie(NULL)과 sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자. 단, 이렇게 하면 더 이상 scanf/printf/puts/getchar/putchar 등 C의 입출력 방식을 사용하면 안 된다.

Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.

Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다.

또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다.

자세한 설명 및 다른 언어의 경우는 이 글에 설명되어 있다.

이 블로그 글에서 BOJ의 기타 여러 가지 팁을 볼 수 있다.


입력

첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.


출력

각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.


예제 입력 1

5
1 1
12 34
5 500
40 60
1000 1000

예제 출력 1

2
46
505
100
2000

소스 코드

let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split('\n');

let count = input[0];
let numbers = [];

for (let i = 1; i < input.length; i++) {
  if (input[i] !== '') {
    numbers.push(input[i].split(' '));
  }
}

for (let i = 0; i < numbers.length; i++){
  let num1 = Number(numbers[i][0]);
  let num2 = Number(numbers[i][1]);

  console.log(num1 + num2);
}

Comment

결론부터 말하자면 Node.js로는 위 문제를 풀 수 없다.
위 문제의 내용은 10950번 문제와 같다. 하지만 시간 제한이 1초로 더 짧다.
해결해보겠다고 반복문을 줄여보려하였으나, 현재의 나는 split을 두 번(개행 '\n'일 때 한 번, 공백 ' '일 때 한 번) 필수이고 더 이상 줄일 수 없다고 판단했다. 이후에 알게된 사실이지만.. 시간 제한이 1초이기 때문에 Node.js에서는 변수 선언만 해도 시간 초과가 떠버린다. WTF.. 추후에 메모리나 Node.js에 대해 더 알게되면 해결할 수 있을지 모르겠지만, 현재로는 해결할 수 없다.ㅠㅠ
BOJ의 모든 문제 풀이에 대한 BOJ 언어 도움말이 있다. 위 문제는 언어 도움말에 있는 예제 소스 코드를 사용했다. 추가적으로 각 언어마다 참고 시간 제한이 적혀있으니 확인해보면 되겠다.


Reference

2개의 댓글

comment-user-thumbnail
2021년 9월 26일

ㅜㅜㅜㅜ

1개의 답글