백준풀기

[c++] 백준 1009번 분산처리 (pow함수를 지양해야 하는 이유)

해언뵤 2024. 1. 22. 03:37

문제

재용이는 최신 컴퓨터 10대를 가지고 있다. 어느 날 재용이는 많은 데이터를 처리해야 될 일이 생겨서 각 컴퓨터에 1번부터 10번까지의 번호를 부여하고, 10대의 컴퓨터가 다음과 같은 방법으로 데이터들을 처리하기로 하였다.
1번 데이터는 1번 컴퓨터, 2번 데이터는 2번 컴퓨터, 3번 데이터는 3번 컴퓨터, ... ,
10번 데이터는 10번 컴퓨터, 11번 데이터는 1번 컴퓨터, 12번 데이터는 2번 컴퓨터, ...
총 데이터의 개수는 항상 ab개의 형태로 주어진다. 재용이는 문득 마지막 데이터가 처리될 컴퓨터의 번호가 궁금해졌다. 이를 수행해주는 프로그램을 작성하라.

 

입력

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

 

출력

각 테스트 케이스에 대해 마지막 데이터가 처리되는 컴퓨터의 번호를 출력한다.

 

문제풀이

처음엔 테스트케이스가 뭔가,, 했다,, 컴퓨터개수가 바뀐건줄;; 근데 그냥 돌려본 횟수였다. (혹시 모르는 나같이 바보같은 사람을 위하여,, 적어봄 ㅋㅎ 부끄럽군요..)
여튼 !! 테스트 케이스만큼 a,b 값을 받고 a^b값을 구하여 컴퓨터 개수로 나눠주기만 하면 된다 ! 아 그리고 컴퓨터 개수로 나눈 값이 0이면 10번 컴퓨터이므로 그것만 if문으로 빼주면 된다.
하지만 여기서 a^b값을 구하는데 조금 생각을 해 보아야 한다. pow함수를 쓴다면 예제에 나온 9^635는 longlong형을 아주 가뿐히 넘어버린다.
<cmath에 내장되어 있는 함수들을 지양하는 이유들은 아래와 같다.>
1. 기본 자료형이  실수이기 때문에 정수형으로 사용시 오차가 생긴다.
2. 시간 복잡도가 O(n)이다.
3. mod n의 값을 구하는 경우, 사용하기 어렵다.
간단한 문제에서는 용이하게 사용가능하나, pow함수의 경우 b의 값이 커질수록 시간복잡도가 매우 커질 것이고 mod연산 또한 overflow와 오차로 값이 제대로 나오지 않을 것이다.
그래서 pow함수는 반복문으로 작성하는 것이 더 효율적이다. 
다시 문제풀이로 돌아가 보자면 b번만큼 a를 곱하는 for문에서 어차피 끝자리 한자리수만 알게되면 되므로 매 계산마다 10으로 나누어 나머지를 구하면 된다 !!
#include <iostream>
using namespace std;

int main(){
    int t, a, b;
    int n = 1;
    cin >> t;

    for (int j = 0; j < t; j++){
        cin >> a >> b;
        for (int i = 0; i < b; i++){
            n = (n*a) % 10; //끝자리수만 알면 되므로 매 계산마다 10으로 나누어 나머지 구함
        }
        if (n == 0) cout << 10 <<endl;
        else cout << n <<endl;
        n=1;
    }
}

'백준풀기' 카테고리의 다른 글

[c++] 백준 2525번 오븐시계  (1) 2024.01.23
[c++] 백준 1094번 막대기 (2진수)  (2) 2024.01.23
[c++] 백준 5597번 과제 안 내신 분  (0) 2024.01.22
[c++] 백준 1259번 팰린드롬(회문)  (0) 2024.01.17
[c++] 백준 1297번  (0) 2024.01.16