프로그래밍/코딩 테스트 연습

[백준] 15552번 : 빠른 A+B (3단계) (C++)

w_w 2024. 1. 10. 09:30
 

15552번: 빠른 A+B

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

www.acmicpc.net

 


 

문제

 

 

 

 


 

 

해석

 

이 문제는 코드작성을 위한 학습보다는 개념을 학습을 위한 문제입니다.

 

 

 

 

 

풀이

 

문제의 개념을 이용해 코드를 작성하면 다음과 같습니다.

 

#include<iostream>
using namespace std;

int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	int T;
	cin >> T;
	while (T--) {
		int a, b;
		cin >> a >> b;
		cout << a + b << '\n';
	}
}

 

테스트 케이스에 대한 while 표현은 다음 문제를 참고 바랍니다. 

https://whitecode2718.tistory.com/66

 

[백준] 10950번 : A+B - 3 (3단계) (C++)

https://www.acmicpc.net/problem/10950 10950번: A+B - 3 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오. www.acmicpc.net 문제 해석 테스트 케이스를 만드는 방법을 연습하는 문제입니다.

whitecode2718.tistory.com

 

이 문제를 통해 학습할 수 있는 건 2가지가 있습니다.

 

	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

 

첫 번째로 위 코드를 작성하지 않으면 수많은 테스트 케이스로 인해 시간에러(시간 초과)가 발생한다는 것입니다. 

 

입력이 많으면 당연히 수행시간이 길어지고, 최대한 수행시간을 줄이려고 여러 알고리즘을 사용하는 게 코딩 알고리즘을 학습하는 본질 중 하나인데 이경우 단순히 합하는 것만으로 시간 초과가 발생했습니다.

 

때문에 위의 코드를 작성해 시간 초과를 어느 정도 피할 수 있습니다. 이유를 간단히 설명하면, 임시로 저장할 버퍼메모리 일부를 사용하지 않고(C++은 C의 버퍼메모리를), 버퍼메모리를 비우지 않고 입출력을 하겠다는 의미입니다. 엄밀히 조금 틀리지만, 버퍼 메모리를 지우는 동작을 수행하지 않음으로써 수행시간을 줄이는 개념입니다.

 

때문에 문제 설명에서 C 버퍼메모리를 사용해야만 하는 getchar( ), scanf( )를 사용할 수 없는 겁니다.

 

두 번째로 endl; 조작자가 아닌 개행 문자 '\n'를 사용해야 한다는 것입니다. endl; 또한 버퍼 메모리를 지우고 다음줄로 바꾼다는 의미이기 때문에 첫 번째의 경우와 마찬가지 이유로 개행 문자 '\n'를 사용하면 수행시간을 줄일 수 있습니다.

 

 


 

정리

 

앞으로 수행시간을 줄이기 위한 입출력 코드를 학습할 수 있었고, 테스트 케이스가 많을 경우 endl; 조작자 보다 개행문자 '\n'를 사용하는 게 더 효율적이라는 사실을 배웠습니다.