#include <stdio.h>
int main(void) {
int a, b, n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d%d", &a, &b);
printf("%d\n", a + b);
}
return 0;
}
문제 : 본격적으로 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()을 추가로 해 주는 것이 좋다.
또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다.
자세한 설명
C
scanf/printf는 충분히 빠릅니다.
C++
- 아래 얘기는 cin, cout을 쓸 때의 얘기지, scanf/prinf로 입출력을 하고자 하신다면 그냥 쓰시면 됩니다. scanf/printf는 충분히 빠릅니다.
- endl은 개행문자를 출력할 뿐만 아니라 출력 버퍼를 비우는 역할까지 합니다. 그래서 출력한 뒤 화면에 바로 보이게 할 수 있는데, 그 버퍼를 비우는 작업이 매우 느립니다. 게다가 온라인 저지에서는 화면에 바로 보여지는 것은 중요하지 않고 무엇이 출력되는가가 중요하기 때문에 버퍼를 그렇게 자주 비울 필요가 없습니다. 그래서 endl을 '\n'으로 바꾸는 것만으로도 굉장한 시간 향상이 나타납니다.
- cin.tie(NULL)은 cin과 cout의 묶음을 풀어 줍니다. 기본적으로 cin으로 읽을 때 먼저 출력 버퍼를 비우는데, 마찬가지로 온라인 저지에서는 화면에 바로 보여지는 것이 중요하지 않습니다. 입력과 출력을 여러 번 번갈아서 반복해야 하는 경우 필수적입니다.
- ios_base::sync_with_stdio(false)는 C와 C++의 버퍼를 분리합니다. 이것을 사용하면 cin/cout이 더 이상 stdin/stdout과 맞춰 줄 필요가 없으므로 속도가 빨라집니다. 단, 버퍼가 분리되었으므로 cin과 scanf, gets, getchar 등을 같이 사용하면 안 되고, cout과 printf, puts, putchar 등을 같이 사용하면 안 됩니다.
Java
BufferedWriter 외에도, StringBuilder로 출력을 모아 놓았다가 그 String을 System.out.println하는 방법도 있습니다.
Python
rstrip을 하라는 건 문자열 자체를 변수에 저장하고 싶을 때 얘기지, 개행문자가 맨 끝에 들어와도 int 변환이나 split()을 그대로 할 수 있습니다. 즉 int(sys.stdin.readline()), sys.stdin.readline().split() 이렇게 해도 아무 문제 없습니다. 참고로 이름이 꽤 길기 때문에 저는 input = sys.stdin.readline을 맨 처음에 함으로써 쓰는 편입니다.
Kotlin
Java처럼 BufferedReader와 BufferedWriter를 쓰면 됩니다.
Ruby
gets와 puts는 충분히 빠릅니다.
Go
bufio를 import하면 버퍼를 사용한 빠른 입출력이 가능합니다.
C#
StreamReader로 읽고, StringBuilder로 출력을 모아 놓았다가 그 String을 Console.WriteLine하는 방법이 있습니다. BufferedStream과 StringWriter로 조금 더 향상시킬 수 있는 것 같으나 자세한 것은 다른 분의 답변을 기다리겠습니다.
VB
StringBuilder로 출력을 모아 놓았다가 그 String을 Console.WriteLine하는 방법이 있습니다.
Rust
아래 "rust05013"으로 올린 댓글을 참조해 주시기 바랍니다.
Swift
fread로 여러 바이트를 한번에 읽고, 정수를 읽어야 할 때마다 미리 읽어둔 문자열로부터 정수를 파싱하면 됩니다. 꽤 복잡한 방법이지만, 이것보다 간단한 방법은 아직 찾지 못했습니다.
Text
입출력 파일이 예제 포함 2개 이상이기 때문에 Text로는 이 문제를 풀 수 없습니다.
아희
안타깝게도 아희로는 이 문제를 풀 수 없습니다. 입출력하는 방법이 하나뿐인데 시간초과가 납니다.
--> 출처 : www.acmicpc.net/board/view/22716
---문제를 찾아보니까 C에서의 printf랑 scanf는 충분히 빠르다고 나와 있어서 문제의 어려움을 느끼지 않았다. 다른 언어로 문제를 풀어봐야할거 같다.
'프로그래밍 문제 > BOJ(백준 온라인 저지)' 카테고리의 다른 글
백준 / 10818 / 최소, 최대 / C / * (0) | 2020.09.18 |
---|---|
[BOJ 1260번] DFS와 BFS(C++) (0) | 2020.09.17 |
[BOJ 2606번] 바이러스(JAVA) (0) | 2020.09.16 |
[BOJ 7579번] 앱(JAVA) (0) | 2020.09.15 |
[BOJ 1520번] 내리막길(JAVA) (0) | 2020.09.14 |