백준 2588 - 곱셈
문제 제목 : 곱셈
문제
(세 자리 수) x (세 자리 수) 는 다음과 같은 과정을 통하여 이루어진다.
4 7 2 --- (1)
x 3 8 5 --- (2)
---------------------
2 3 6 0 --- (3)
3 7 7 6 --- (4)
1 4 1 6 --- (5)
---------------------
1 8 1 7 2 0 --- (6)
( 1 ) 과 ( 2 ) 위치에 들어갈 세 자리 자연수가 주어질 때,
( 3 ), ( 4 ), ( 5 ), ( 6 ) 위치에 들어갈 값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 ( 1 ) 의 위치에 들어갈 세 자리 자연수가, 둘째 줄에 ( 2 ) 의 위치에 들어갈 세 자리 자연수가 주어진다.
출력
첫째 줄 부터 넷째 줄 까지 차례대로 ( 3 ), ( 4 ), ( 5 ), ( 6 )
에 들어갈 값을 출력한다.
예제 입력 1
472
385
예제 출력 1
2360
3776
1416
181720
이 문제는 사칙 연산 중 곱셈 의 필기 연산 과정을 이용하여 푸는 문제이다.
( 1 ), ( 2 ) 번으로 지정된 숫자는 입력될 숫자 를 의미하며,
( 3 ), ( 4 ), ( 5 ) 번으로 지정된 숫자는 계산 과정 중 발생하는 숫자 를 의미하며,
( 6 ) 번은 ( 1 ), ( 2 ) 번의 계산 결과를 의미한다.
이 문제에서 친절하게 3 자리 숫자를 2 번 입력한다고 말했다.
즉, 입력될 두 수에 대한 가변 길이는 신경쓰지 않아도 된다고 친절히 설명해 준다.
가변 길이에 대한 신경 요소와, 굉장히 긴 경우를 제외하였으므로, 반복문의 사용은 하지 않아도 된다.
콘솔 입력에 대한 내용은 이전 아티클 백준 1000 번을 참고하길 바란다.
나는 BufferedReader
클래스를 사용하므로, 취향에 맞게 입력 받으면 된다.
Answer
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int one = Integer.parseInt(br.readLine()); // ( 1 )
int two = Integer.parseInt(br.readLine()); // ( 2 )
// 5, 8, 3 순서로 ( 3 ), ( 4 ), ( 5 ) 결과가 나온다.
// two 를 10으로 나눴을 때의 나머지값
int three = one * (two % 10); // 5
two = two / 10; // two = 38
int four = one * (two % 10); // 8
two = two / 10; // two = 3;
int five = one * (two % 10); // 3
int six = one * two;
System.out.println(three); // ( 3 )
System.out.println(four); // ( 4 )
System.out.println(five); // ( 5 )
System.out.println(six); // ( 6 )
}
}
곱셈의 순서는 가장 작은 수 부터 시작한다.
배열까지 원활하게 아는 상태에서는 물론 반복문과 배열을 이용하면 쉽지만,
현재 상태에서 배열과 반복문의 개념이 익숙치 않다는 것을 상정하고 문제를 풀었다.
반복문과 배열 없이 문제를 풀려면, 수의 개념 중 나머지 라는 개념을 이용하여 풀면 된다.
예를 들어, 123
이란 숫자가 있다고 가정한다.
123
에 % 10
연산의 결과는 3
이다.
위의 연산 이후, 123
을 10으로 나눈다. 123 / 10 == 12
12
에 % 10
연산의 결과는 2
이다.
또 다시, 12
에 10을 나눈다. 12 / 10 == 1
1
의 % 10
결과는 1
이다.
따라서, 앞의 숫자가 아닌, 뒤의 숫자에서부터 연산이 필요 한 상황이라면,
% 10
반복을 이용하여 연산이 가능하다.
추후 다양한 알고리즘 문제를 풀 때 정말로 많이 사용되니 개념을 숙지하는 것이 중요하다.