2588번: 곱셈

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

www.acmicpc.net

문제

  세 자릿수 곱셈에서 (3), (4), (5), (6) 위치에 들어갈 값을 출력

 

입력

  첫째 줄에는 (1)의 위치에 들어갈 세 자리 자연수, 둘째 줄에 (2)의 위치에 들어갈 세 자리 자연수가 주어진다.

 

출력

  첫째 줄부터 넷째 줄 까지 차례대로 (3), (4), (5), (6)의 값을 출력

 

예제 입력

472
385

예제 출력

2360
3776
1416
181720

 


 

코드

1. 입력값을 문자열로 처리하는 경우

import java.util.*;

public class Main {
	public static void main(String[] args) {
		String num1, num2;
		int sum, pos;
	
		Scanner sc = new Scanner(System.in);
		
		num1 = sc.nextLine();
		num2 = sc.nextLine();
		
		for (int i = 2 ; i >= 0 ; i--) {
			sum = 0;
			pos = 1;
			for (int j = 2 ; j >= 0 ; j--) {
				sum += Character.getNumericValue(num1.charAt(j)) * Character.getNumericValue(num2.charAt(i)) * pos;
				pos *= 10;
			}
			System.out.println(sum);
		}
		System.out.println(Integer.parseInt(num1) * Integer.parseInt(num2));
		sc.close();
	}
}

처음에는 배열을 쓰지 않으면서 각 자리를 사용해야 하므로 문자열로 처리하는 게 좋다고 생각했다.

이중 ``for``문에서 한 단계씩 계산하는 과정은 우리가 일반적으로 수학식을 계산하는 과정과 동일하다.

 

  계산과정

  1. 숫자 2개를 문자열로 받은 다음 ``charAt``으로 한 자리씩 추출한다.
  2. ``getNumericValue()``로 각 위치의 자리를 숫자 변환한 뒤 서로 계산한다.
  3. 2의 결과값에 가중치(pos)를 곱해서 더한다.
    ``pos``는 10진수의 가중치 값을 곱해주는 변수이다(1의 자리, 10의 자리, 100의 자리수이므로)

 

 

 

2. 입력값을 숫자로 처리하는 경우

import java.util.*;

public class Main {
	public static void main(String[] args) {
		int num1, num2, sum;
	
		Scanner sc = new Scanner(System.in);
		
		num1 = sc.nextInt();
		num2 = sc.nextInt();
		
		System.out.println(num1 * (num2 % 10));
		System.out.println(num1 * ((num2 / 10) % 10));
		System.out.println(num1 * (num2 / 100));
		System.out.println(num1 * num2);
		
		sc.close();
	}
}

위의 코드도 문자열로 바꿀 수는 있지만 로직의 차이가 있어서 정리했다.

예를 들어 ``472 * 5``인 경우 1번 코드는 ``((2 * 5) * 1) + ((7 * 5) * 10) + ((4 * 5) * 100) = 2360``이여서 ``for``문에서 3번 연산을 하는 반면에 2번 코드에서는 ``472 * 5 = 2360``으로 연산을 한 번에 끝내기 때문에 훨씬 효율적이다.

 

 

 

'기타 > 백준' 카테고리의 다른 글

[백준][Java, 1000] A + B  (0) 2021.09.14

+ Recent posts