[C] 백준 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개까지나 있어서 헷갈리고 뭐 하나라도 잘못 입력하면 바로 다른 결과값을 낸다는 단점이 있다.
확실히 변수의 개수를 줄일 수 있는 만큼 줄인다면 훨씬 코드도 깔끔하고 덜 헷갈려 좋은 것 같으니 유의하자.
'Programming > BOJ' 카테고리의 다른 글
[C] 백준 2439번 : 별 찍기 - 2 (0) | 2020.06.02 |
---|---|
[C] 백준 10950번 : 정수를 입력받은 후 합 출력 (0) | 2020.06.01 |
[C] 백준 2884번 : 알람시계 맞추기 (0) | 2020.05.30 |
[C] 백준 2753번 : 윤년 (0) | 2020.05.30 |
[C] 백준 1008번 : A/B 연습 (0) | 2020.05.30 |