IT/BaekJoon

[백준/C++] 2588번 - 곱셈: 왜 int B[2]는 안될까?

Buang 2022. 7. 12. 19:31
반응형

1. 문제

https://www.acmicpc.net/problem/2588

 

2588번: 곱셈

첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.

www.acmicpc.net


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


 

반응형