1. 문제
https://www.acmicpc.net/problem/2588
2. 풀이
문제를 보면 결국 출력해야 할 건 4개다.
472 x 5 결과값
472 x 8 결과값
472 x 3 결과값
472 x 385 결과값
이렇게.
385를 배열을 이용해서 분리하면 쉽게 풀 수 있겠지 했다.
그런데 틀렸다.
#include <stdio.h>
int main() {
int A;
int B[2];
scanf("%d %d", &A, B);
printf("%d \n", A*B[2]);
printf("%d \n", A*B[1]);
printf("%d \n", A*B[0]);
return 0;
}
나는 변수 2개 모두 int로 선언하고
변수 B를 배열로 만들어서 위에처럼 코드를 짰다.
그런데 결과가 이상하다.
맨 처음에 472를 입력하고
두 번째로는 385를 입력했다.
3번째 줄부터 결과값들이 나온건데
결과값이 왜 이럴까. 마치
B[2] = 1이고
B[1] = 0이고
B[0] = 385인 것처럼 나온다.
나는
B[0] = 3
B[1] = 1
B[2] = 8
일 줄 알았었다.
그도 그럴게 내가 두 번째로 입력한 숫자는 318이니까
이 318이 B라는 배열에 한 자리씩 들어갈 줄 알았었다.
그런데 B[0]에 318이 모두 다 들어가버리고
B[1]에는 0, B[2]에는 1이 들어갔다.
무엇보다도 위에처럼 코드를 짜면
배열과 정수를 곱할 수 없다는 오류가 마지막에 뜬다.
변수 B를 int가 아닌 char로 바꿔서 문제를 푸니 풀렸다.
즉 int B[2];가 아닌 char B[2];로 바꿔줘야 한다.
3. 코드
방법 1)
#include <stdio.h>
#include <stdlib.h> //atoi 함수 선언 시 필요한 라이브러리
int main() {
int A;
char B[2];
scanf("%d", &A);
scanf("%s", B);
printf("%d \n", A * (B[2] - '0')); // - '0'을 써야 숫자로 인식한다.
printf("%d \n", A * (B[1] - '0')); // -'0'없이 쓰면 숫자가 아닌 문자로 인식함.
printf("%d \n", A * (B[0] - '0'));
printf("%d \n", A * atoi(B)); //atoi는 char to integer의 준말로
//문자열을 정수 형태로 바꿔준다.
return 0;
}
위의 코드에서 - '0'을 쓴 이유는
B[2] 안에 들어가는 게 설령 숫자라 할 지라도
위에서 char B[2]; 즉 문자열 형태로 선언했기 때문에
가령 숫자 1을 넣더라도 숫자 1로 인식하지 않고 문자 "1"로 인식해버린다.
당연한 소리지만 정수와 문자는 서로 곱할 수 없다.
약간 '부앙'이란 글자에 3을 곱하라고 하면 그게 도대체 무슨 소리지?하는 느낌이다.
당연한 말이지만 숫자는 숫자끼리만 곱셈이 가능하다.
B안에 들어간 걸 문자가 아닌 숫자로 인식하도록 만들기 위해서
뒤에 - '0'을 붙여준다. 그럼 B에 1을 넣었어도 문자 1이 아닌 숫자 1로 인식해서
사칙연산이 가능해진다.
방법 2)
#include <stdio.h>
int main() {
int A, B;
scanf("%d %d", &A, &B);
printf("%d \n", A * (B%10)); // 1의 자리 숫자만 추출
printf("%d \n", A * ((B%100)/10)); // 10의 자리 숫자만 추출
printf("%d \n", A * (B/100)); // 100의 자리 숫자만 추출
printf("%d \n", A * B);
return 0;
}
나눗셈을 이용해서 푸는 방법도 있다.
위에서 385를 분리해야 한다고 언급했었었다.
B/100을 계산하면 100의 자리 숫자만 추출된다.
/는 나누기를 한 뒤 몫을 구할 때 사용하는 기호다.
B에 385를 입력했다고 했을 때
385/100 = 3 이다.
B%10을 계산하면 1의 자리 숫자만 추출된다.
%는 나머지를 구할 때 사용하는 기호다.
나눗셈을 한 뒤 나머지 값을 구할 때 %를 사용한다.
만약 B가 385 라면
385 % 10 = 5 다. 나머지가 아닌 몫을 구하는 / 기호와 혼동하면 안된다.
((B%100)/10)) 을 계산하면 10의 자리 숫자마나 추출된다.
((385%100)/10)) = 8 이 나온다.
각각의 자릿수를 A와 곱해주면 된다.
방법3)
지식 in에 질문을 올렸는데 받은 답변이다.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int A, B, C[3];
scanf("%d %d", &A, &B); // 우선 두 수를 입력 받아요. A = 472, B = 385
// 그다음은 385의 백의 자리 숫자는 C[0], 십의 자리 숫자는 C[1], 일의 자리 숫자는 C[2]
// 분리해서 담아야 겠죠.
C[0] = (B / 100) * 100; // 백의 자리 숫자 추출
C[1] = ((B - C[0]) / 10) * 10; // 십의 자리 숫자 추출
C[2] = B % 10; // 일의 자리 숫자 추출
// 위의 코드가 실행되면
// C[0] = 300, C[1] = 80, C[2] = 5 가 담기겠죠.
// 그러면 차례대로 A * C[2], A * C[1], A * C[0]를 계산하면 되겠죠.
return 0;
}
출처: https://kin.naver.com/qna/detail.naver?d1id=1&dirId=1040101&docId=423711840
'IT > BaekJoon' 카테고리의 다른 글
[백준/JAVA] 1008번. A/B의 값은? (0) | 2022.11.12 |
---|---|
[백준/C++] 25083번 - 자라나라~ '새싹' 문제 (0) | 2022.07.13 |
[백준/C++] 10430번 - 나머지 (0) | 2022.07.12 |
[백준/C++] 18108번- 1998년생인 내가 태국에서는 2541년생?! (0) | 2022.07.12 |
[백준/C++] 1008번 A/B : '절대오차'가 무슨 소리일까? (0) | 2022.07.12 |