일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- subclass500
- 철도공학
- 호주비자신체검사
- 호주학생비자
- 1421번
- 호주기숙사
- 철도교통안전관리자
- 시드니
- 호주
- c언어
- C++
- 교환학생
- BOJ
- 백준
- 교통법규
- 교환학생짐
- Scape
- 나무꾼이다솜
- C
- 운전이론
- 열차운전
- 군전세객차
- 시드니기숙사
- 교환학생짐싸기리스트
- 교환학생짐싸기
- 교통안전법
- 호주휴대폰개통
- UTS
- scapesydneycentral
- 교통안전관리론
- Today
- Total
탐정사무소
15552번 빠른 A+B(C/C++) 본문
사실 두 수를 더하라는 간단한 문제에 지나지 않지만, 앞으로 메모리 초과나 시간 초과가 뜰 때를 대비할 문제라고 생각이 들어 C와 C++두 가지로 시도해보았다.
https://www.acmicpc.net/problem/15552
15552번: 빠른 A+B
첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.
www.acmicpc.net
문제
본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.
C++을 사용하고 있고 cin/cout을 사용하고자 한다면, cin.tie(NULL)과 sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자. 단, 이렇게 하면 더 이상 scanf/printf/puts/getchar/putchar 등 C의 입출력 방식을 사용하면 안 된다.
첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.
해결과정
솔직히 C면 간단히 for문 쓰고 끝내면 되는 것인데,
문제에서 왜 C++은 저렇게 긴 설명을 놓고 저런 코드를 추가하라는 것인지 궁금해졌다.
백준 설명에 따르면, C의 scanf와 printf는 충분히 빠르지만 C++에서 cin과 cout은 속도가 다소 느리다는 것 같다. 문제에서도 최대 1,000,000번의 연산을 수행할 수도 있기 때문에, C++은 시간이 초과될 수도 있다는 것 같다.
cin.tie(NULL)은 출력 버퍼를 지우는 일을 생략하며, sync_with_stdio(false)는 ios 클래스에 있는 함수인데 C와 C++의 버퍼를 분리함으로써 연산 속도를 빠르게 한다.
코드
C언어
#include <stdio.h>
int main(){
int T,i;
int A,B;
scanf("%d",&T);
for(i=0;i<T;i++){
scanf("%d %d",&A,&B);
printf("%d\n",A+B);
}
return 0;
}
C++
#include <iostream>
using namespace std;
int main() {
cin.tie(NULL);
ios::sync_with_stdio(false);
int T, i;
cin >> T;
for (i = 0; i < T; i++) {
int a, b;
cin >> a >> b;
cout << a + b << "\n";
}
return 0;
}
결과
'학과공부 > 백준' 카테고리의 다른 글
2108번 통계학(C) (1) | 2021.08.15 |
---|---|
1978번 소수 찾기(C) (0) | 2021.08.14 |
1966번 프린터 큐(C) (0) | 2021.08.12 |
1929번 소수 구하기(C) (0) | 2021.08.12 |
1920번 수 찾기(C) (0) | 2021.08.11 |