본문 바로가기

프로그래밍 언어/C 언어

[백준] 1009 분산처리




위 문제는 기말고사가 끝난 뒤 선배와의 약속 때문에 풀게 되었다. 

a^b을 변수에 대입하려고 했더니 오버플로우 오류가 생겼다. 오버플로우란 메모리 용량을 넘어선 값이 들어가 생기는 오류이다. 그래서 다른 방법인 규칙을 찾아 코딩하게 되었다. 약간 하드코딩의 느낌이 나서 맞추고도 완전 기쁘지는 않았다. 



아래는 내 코드이다.


#include <stdio.h>

int main()
{
    int four[4][4] = { { 6,8,4,2 }, {1,3,9,7}, { 6,2,4,8}, {1,7,9,3} }; 
                        //a = 8 / 3 / 2 / 7(나머지가 0,1,2,3인 순서)
    int two[2][2] = { {6,4}, {1,9} };
                //a = 4 / 9(나머지 0,1)
    int *result = NULL;
    int i, T, a, b, first, column, row;

    while (scanf("%d", &T) != 1);
    result = (int*)malloc(sizeof(int)*T);
    for (i = 0; i < T; i++)
    {
        row = 0, column = 0, first = 0;
        while (scanf("%d %d", &a, &b) != 2);
        first = a % 10;
        if (first == 1 || first == 5 || first == 6)
            result[i] = first;
        else if (first == 0)
            result[i] = 10;
        else if (first == 4 || first == 9) {
            row = first % 4;
            column = b % 2;
            result[i] = two[row][column];
        }
        else if (first == 3) {
            column = b % 4;
            result[i] = four[1][column];
        }
        else {
            row = first % 4;
            column = b % 4;
            result[i] = four[row][column];
        }
    }
    for (i = 0; i < T; i++)
        printf("%d\n", result[i]);

    free(result);

    return 0;
}


나누었을 때 나머지의 규칙을 찾아 대입하였다. 일단 내 힘으로 완성을 하고 친구의 코드를 봤다. 친구의 코드에서 내가 막혔던 오버플로우 오류 부분의 해결 방법을 보았다. 그래서 그 부분만 고쳐 다시 제출해서 맞추고 잘 수 있었다.



아래가 그 코드이다.


#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *result;
    int i, j, t, a, b, num;
    
    while(scanf("%d", &t) != 1);
    result = (int*)malloc(sizeof(int)*t);
    for(i=0; i<t; i++)
    {
        num = 1, a = 0, b = 0;
        while(scanf("%d %d", &a, &b) != 2);
        for(j=0; j<b; j++)
        {
            num*=a;
            if(num>10)
                num%=10;
        }
        if(num == 0)
            num = 10;
        result[i] = num;
    }
    
    for(i=0; i<t; i++)
        printf("%d\n", result[i]);
    
    free(result);
    return 0;
}



변수에 a^b를 다 계산해서 대입하지 않고 num이 10보다 커지면 바로 10으로 나눈 나머지를 대입해서 오버 플로우 문제를 해결할 수 있었다.


+) 어떤 사람이 코드가 지저분하다고 했다. 나중에 고쳐야겠다.

'프로그래밍 언어 > C 언어' 카테고리의 다른 글

[백준] 1010 다리놓기  (0) 2017.06.27