IT 프로그래밍/백준

[C++] 백준 1009번 분산처리

기술1 2024. 3. 31. 20:32
반응형

https://www.acmicpc.net/problem/1009

 

1009번: 분산처리

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트 케이스에 대해 정수 a와 b가 주어진다. (1 ≤ a < 100, 1 ≤ b < 1,000,000)

www.acmicpc.net

코드


#include <iostream>
#include <cmath>

using namespace std;
int main()
{
	int n;
	cin >> n;

	for (int i = 0; i < n; i++)
	{
		int a, b;

		cin >> a;
		cin >> b;

		long long result = 1;
		for (int i = 0; i < b; i++)
		{
			result *= a;
			result %= 10;
		}

		if (result == 0)
			cout << 10 << endl;
		else
		cout << result << endl;
	}
}

풀이


처음에 pow()함수를 써서 하면 간단하게 될 줄 알았는데 수가 커지니깐 오버플로우가 생겨서 값이 정상적으로 나오지 않았습니다. 그래서 for문을 사용해서 overflow가 나지 않도록 계속해서 %10을 해주면서 소거해주었습니다. 

 

그리고 제가 마지막에 실수한 부분이 있었는데 바로 나머지가 10일 때 0이 나오는데 이 경우에 10번째 컴퓨터에 할당이 되는 것인데 이거를 고려해주지 않아서 계속 틀렸습니다. 0이면 10이 출력되어야 합니다. 

 

1. 비교할 n cin 입력 후 for문을 만들어준다.

	int n;
	cin >> n;

	for (int i = 0; i < n; i++)
	{
		int a, b;

		cin >> a;
		cin >> b;

for문을 만들어줍니다. 먼저 몇개를 입력받을지 n으로 정한 다음 a, b를 정의해줍니다. 

 

2. result를 생성해준 다음에 result에 a를 b만큼 거듭제곱하는 for문을 만듦

		long long result = 1;
		for (int i = 0; i < b; i++)
		{
			result *= a;
			result %= 10;
		}

result의 기본값은 1로 받아줍니다. 그 다음 a를 곱하면서 b만큼 거듭제곱이 되게 합니다. 그리고 각 계산마다 %10을 해주어서 overflow를 방지해줍니다. 

 

 

3. 만약 나머지가 0이면 10번째 컴퓨터로 나오게 해준다. 

		if (result == 0)
			cout << 10 << endl;
		else
		cout << result << endl;

아마 정답률이 낮은 이유 중 하나라고 생각이 듭니다. result가 0이 나오면 10번째 컴퓨터에 할당된 것이므로 10을 출력하게 만들어줍니다. 


주의할 점

  • pow 함수를 사용하면 overflow가 발생하므로 pow를 사용할 때 주의해야 한다.
  • 나머지가 필요한 것이므로 각각마다 나머지를 구해준다면 overflow 없이 가능하다.
  • 10의 나머지가 0인데 0일 경우 10번째 컴퓨터에 할당되는 것이므로 10이 출력되도록 if문을 만들어주어야 한다. 

 

반응형