알고리즘/백준

[백준] 2588 - 곱셈

leegeonwoo 2023. 10. 13. 19:30

• 문제

 

만약 이 문제를 보고나서 어떻게 접근해야하지? 라는 생각이 든다면 가장 좋은 방법은 종이와 펜을 가지고 실제로 식을 풀어보는 것이다.

문제만 보면 막막할 수 있지만 직접 풀고나서는 생각이 달라질 수 있다.

 


• 풀이

차근차근 하나씩 해결해나가보자

먼저 곱할 수인 A와 B입력값 2개를 받는다.

 

식을 풀어보면

472 * 5

472 * 8

472 * 3 이다.

A는 고정된 값이라는 것을 알 수 있다.

B는 3 8 5를 각각 일의 자리 숫자로 구해주기만 하면된다.

 

이때 %(나머지) 연산자를 활용하여 값을 구해낼 수 있다.

B % 10의 값은 5이다. B값 385의 5를 구할 수 있고,

B / 10을 하면 1의자리값인 5를 제외한 38을 구할 수 있다. 여기서 다시 %10 연산자를 해주면 385의 8을 구해낼 수 있다.

마지막으로 38에서 한번더 /10을 해주면 385의 3을 구해낼 수 있다.

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int A = sc.nextInt();
		int B = sc.nextInt();
		
		System.out.println(A * (B%10));
		System.out.println(A * (B/10%10));
		System.out.println(A * (B/10/10%10));
		}
}

 

출력결과

출력결과를 보면 알 수 있듯이 각 자리에대한 곱셈값을 구해낼 순 있지만 코드의 가독성이 너무 떨어진다.

 

 

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int A = sc.nextInt();
		int B = sc.nextInt();
		int sum = 0;
		int num = 0;
		while(B > 0) {
			num = A * (B%10);
			System.out.println(num);
			B /= 10;
		}
		System.out.println(sum);
		}
}

위와같이 반복문을 사용하여 가독성을 크게 높여줄 수 있다.

num에는 A와 B의 각자리 값을 곱해주고

B의 값은 반복문을 지날때마다 /10한 값을 B에 넣어준다

B /= 10의 의미는 B = B / 10와 동일하다.

 

이제 각 곱셉의 합인 181720값을 구해보자.

2360, 3776, 1416 이라는 값을 프로그래밍을  통해 구해냈지만 생각해보면 실제로 이 값들 뒤에는 0들이 생략되어있다.

즉, 2360, 37760, 141600 이라는 뜻이다.

서로 상관관계의 규칙을 찾아보면

2360 * 1

3776 * 10

1416 * 100

이라는 규칙을 찾아낼 수 있다.

그러면 누적합을 뜻하는 sum변수를 선언하고, 각각의 값을 변수에 *10을 해가며 누적합을 해주면 원한는 값을 얻어낼 수 있을 것이다.

 

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int A = sc.nextInt();
		int B = sc.nextInt();
		int sum = 0;
		int num = 0;
		int temp = 1; //곱셈한 결과에 자리 수를 하나씩 증가시켜주기위한 temp변수
		while(B > 0) {
			num = A * (B%10);
			sum += num * temp; //sum = sum + (num * temp)
			System.out.println(num);
			temp *= 10; //temp = temp * 10을 해준다.
			B /= 10;
		}
		System.out.println(sum);
		}
}

sum과 temp변수가 추가되었는데 sum은 곱셈한 각 값의 합을 구해주기위한 변수이고,

temp는

2360 * 1

3776 * 10

1416 * 100 에서 1, 10, 100을 의미한다.

여기서 주의할 점은 temp를 0으로 초기화해주면 처음 2360 * 0이 되버리기때문에 원하는 값을 얻어낼 수 없다.

sum은 총합이므로 반복문을 빠져나와 한 번만 출력되게 해준다.


마무리

  1. 복합대입 연산자를 알게되었다.
  2. 처음으로 알고리즘 다운 알고리즘은 풀어본듯하다.

 필자의 어휘력이 좋지않아 다른사람이 볼 때는 이해가 잘 될지 모르겠다..

쓰다보면 필력또한 발전할 거라 믿고 꾸준히 써보겠다.

728x90