[C] 백준 2588번 : 세자리수 곱셈

2020. 5. 30. 01:39

 

 

(세자리수)*(세자리수)의 세로식과 관련된 문제이며 2588번 문제는 아래와 같다.

 

 

백준 2588번

 

처음에는 단순히 각 자릿수를 개별값으로 입력받아서 각각 계산을 하도록 하면 되겠다 싶어서 아래처럼 코드를 짰다.

#include <stdio.h>

int main() {
    int A, B, C;
    int D, E, F;
    int num3, num4, num5;
    
    scanf("%d %d %d", &A, &B, &C);
    scanf("%d %d %d", &D, &E, &F);
    
    num3 = (C*F)+(10*B*F)+(100*A*F);
    num4 = (C*E)+(10*B*E)+(100*A*E);
    num5 = (C*D)+(10*B*D)+(100*A*D);   
    
    printf("%d\n", num3);
    printf("%d\n", num4);
    printf("%d\n", num5);
    printf("%d\n", num3+10*num4+100*num5);
    
}

하지만 Dev c++에서 먼저 실행을 시켜보니 아래와 같은 수행결과를 얻었다.

숫자 472를 입력하면 4, 7, 2를 각각 A, B, C로 인식하는 게 아니라 472 자체를 A로 퉁쳐버리는 것이다.

아래에서 1, 1, 1, 1은 임의로 내가 입력한 값이다.

즉, 위의 코드는 A=472, B=385, C=D=E=F=1 이 되도록 하는 코드인 것이다.

 

그렇다면 어떤 다른 방식으로 해결하면 좋을까.

 

아예 472와 385 자체를 A와 B로 지정하여 나머지 계산을 이용해서 문제를 해결하면 좋을 것 같다는 생각이 들었다.

그에 의해 아래와 같이 코드를 짰다.

#include <stdio.h>

int main() {
    int A, B;
    int num3, num4, num5;
    
    scanf("%d", &A);
    scanf("%d", &B);
        
    num3 = (B%10)*A;   //(3)의 값을 구하는 식, (B의 일의자릿수)*A
    num4 = (((B/10)%10)*A);   //(4)의 값을 구하는 식, (B의 십의자릿수)*A
    num5 = (B/100)*A;     //(5)의 값을 구하는 식, (B의 백의자릿수)*A
    
    printf("%d\n", num3);
    printf("%d\n", num4);
    printf("%d\n", num5);
    printf("%d\n", num3+10*num4+100*num5);
    
}

위의 코드를 Dev c++에 실행시킨 결과는 아래와 같다. 결과는 성공 !

바로 백준에 제출하니 정답 처리 되었다. 

다시 시도해본 코드로 비록 정답처리는 되었지만

num4를 구하는 과정에서 십의 자릿수를 표현할 때 조금 더 간단한 방법이 없는지 고민했는데

결국 위에 쓴 식보다 좀 더 간단하게 표현하는 방법은 생각해내지 못했던 건 아쉽다.

 

처음 시도해본 코드와 나중의 성공한 코드를 비교했을 때

처음의 코드는 변수가 9개까지나 있어서 헷갈리고 뭐 하나라도 잘못 입력하면 바로 다른 결과값을 낸다는 단점이 있다.

확실히 변수의 개수를 줄일 수 있는 만큼 줄인다면 훨씬 코드도 깔끔하고 덜 헷갈려 좋은 것 같으니 유의하자.

 

BELATED ARTICLES

more