프로그래밍/코딩 테스트 연습

[백준] 2588번 : 곱셈 (1단계) (C++)

w_w 2024. 1. 5. 12:46
 

2588번: 곱셈

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

www.acmicpc.net

 

 


 

 

문제

 

 

 


 

 

 

해석

 

문제를 보면 바로 떠올릴 수 있는 방법은 두 번째로 입력받은 수를 자릿수대로 분리해서 첫 번째로 입력받은 정수에 곱하고, 그 결과를 출력하면 될 것 같습니다.

 

그렇다면 우리는 두 가지를 해결할 수 있는지 생각해줘야 합니다.

 

 

 두 번째 정수를 자릿수대로 분리할 수 있는가?

 

 

저는 두 가지 방법을 생각했습니다.

 

char, string 형 배열로 받아 정수형으로 출력하는 방법으로 char, string형 배열은 각 배열에 문자 하나를 저장하므로 385를 입력하면 각각 3,8,5이 문자형으로 받아질 것이고, 이를 숫자 아스키코드로 바꾼 후 정수형으로 출력하면 자릿수대로 분리할 수 있습니다.

 

두 번째 방법으로 int형 정수로 받아 '/' 연산으로 백의 자리, 십의 자리, 일의 자리의 몫으로 배열에 따로 저장하는 방법입니다.

 

첫 번째 방법은 나중에 이 방법으로 푸는 문제가 있으므로 이문제는 두 번째 방법으로 풀겠습니다.

 

 

  • 출력해야 하는 값들을 따로 저장했다가 출력할 수 있는가? 한꺼번에 가능한가?

역시나 배열을 따로 선언한 후 그 배열에 저장하고 출력할 수 있습니다. 혹은 자릿수를 분리할 때 이미 배열을 만드므로 그 배열에 대한 출력을 해도 될 것 같습니다.

 

 

 

 

풀이

 

int형 정수로 받아 '/' 연산으로 백의 자리, 십의 자리, 일의 자리의 몫으로 배열에 따로 저장하는 코드입니다.

 

배열[0] = 정수 / 100;                            // 100의 자릿수
배열[1] = (정수 % 100) / 10;                     // 10의 자릿수
배열[2] = ((정수 % 100) % 10);                   // 1의 자릿수

 

저장된 배열을 이용해 바로 출력할 수 있습니다.

 

#include<iostream>
using namespace std;

int main() {
    int x, y;
    int a[3];
    cin >> x >> y;
    a[0] = y / 100;
    a[1] = (y % 100) / 10;
    a[2] = ((y % 100) % 10);

    for (int i = 2; i >= 0; i--) 
        cout << a[i] * x << endl;
    
    cout << x*y << endl;
}

 

여기서 for 문을 2부터 시작해 0으로 끝내는 이유는 a배열의 뒤부터 1의 자릿수이기 때문입니다.

 

 

 

 

 


 

 

 

정리

 

입력받은 정수를 자릿수 별로 값을 분리하는 방법을 생각하는 게 핵심인 문제입니다.

 

해석에서도 봤다시피 char, string 자료형으로 받아 분리하거나, int형 변수를 받아 자릿수대로 분리하는 방법 등 자릿수 분리 알고리즘은 다양하기 때문에 다 연습해 보는 것이 좋습니다.