[BaekJoon] 2588번 - 곱셈 (java)

1. 문제

👉 문제 바로가기

- 조건

시간 제한 메모리 제한
1초 128MB


- 문제

(세 자리 수) × (세 자리 수)는 다음과 같은 과정을 통하여 이루어진다. img1

(1)과 (2)위치에 들어갈 세 자리 자연수가 주어질 때 (3), (4), (5), (6)위치에 들어갈 값을 구하는 프로그램을 작성하시오.

- 입력

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

- 출력

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

- 예제

  입력      출력  
472
385
2360
3776
1416
181720





2. 풀이

이 문제는 입력된 숫자의 자리수를 분리하여 연산을 할 수 있는지 확인하는 문제다.

처음 입력받은 세자리 자연수에 두번째 입력받은 세자리 자연수를 분리하여 각각 곱한 값을 출력한 뒤, 원래 식의 결과값을 출력하는 문제이다.


문제 접근 방법을 2가지로 나누어 설명하고자 한다.

  1. 두번째 숫자를 문자열로 입력받고 chatAt()를 사용해 각 자릿수의 숫자를 하나씩 꺼내쓰는 방법
  2. 나누기와 나머지 연산을 통해 각 자릿수의 숫자를 구하는 방법


- 1. 두번째 숫자를 문자열로 입력받고 chatAt()를 사용해 각 자릿수의 숫자를 하나씩 꺼내쓰는 방법

charAt() 메서드는 문자열 각 자리수의 숫자를 참조할 수 있다.

즉, 문자열(string)의 인덱스 위치에 있는 문자를(character) 반환한다.

변수 B에 문자열 abc가 저장되어있을 때 문자열을 문자들이 모인 배열이라고 보고
인덱스를 참조하여 해당 문자를 반환한다.

이때 반환되는 값은 문자의 아스키코드값(숫자)이다.

예를 들어보자.
String s = 385; 가 있다고 하자.
int result = s.chatAt(0); 이라고 하면 result = 3 이라고 생각하겠지만
사실은 숫자 3이 아니라 문자 3이다.
문자 3을 숫자로 변환하는데 아스키코드를 사용하는데, 아래의 사진을 참고하면 된다.
문자 3은 십진수로 숫자 51인 것을 알 수 있다.

int result = s.chatAt(1); 에서 result는 8이 아닌 56이고,
int result = s.chatAt(2); 에서 result는 5이 아닌 53이다.

그렇다면 아스키코드로 변환하지 않고 숫자 그대로를 출력하고 싶으면 어떻게 해야할까?
'0'(char)이나 48을 빼줘야 한다.
s.chatAt(0) - '0' = 51 - 48 = 3;

img1



이제 charAt()을 사용해 풀이해보자.

import java.util.Scanner;
 
public class Main {
 
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
 
		int A = sc.nextInt();
		String B = sc.next();
        
		sc.close();
 
		System.out.println(A * (B.charAt(2) - '0'));
		System.out.println(A * (B.charAt(1) - '0'));
		System.out.println(A * (B.charAt(0) - '0'));
		System.out.println(A * Integer.parseInt(B));
 
	}
}

위와같이 객체를 생성할 때, Scanner(System.in) 에서 System.in 은 입력한 값을 Byte 단위로 읽는 것을 뜻한다.

close() 메서드로 사용해 사용이 끝난 Scanner 객체의 자원을 닫아준다.

B.charAt(2) 는 B의 첫번째자리의 문자이고 '0'(48)을 빼주어 첫번째자리의 숫자를 구한다.
마지막 값은 Integer.parseInt()를 사용해서 문자열 B의 값을 숫자로 변환하고 A와 곱해 원래 식의 결과를 출력한다.

Scanner에 대해 더 자세히 알고싶다면 여기를 눌러보자





- 2. 나누기와 나머지 연산을 통해 각 자릿수의 숫자를 구하는 방법

입력받은 값이 385 라고 할 때, 수학적 연산을 통해 값의 각 자릿수의 숫자를 구해보자.

  • 일의 자리 숫자 5를 구하기 위해서 385 % 10을 하면 10으로 나눈 나머지 값을 구하기 때문에 반환값이 5가 된다.
  • 십의 자리 숫자 8을 구하기 위해서 385 % 100을 하면 두자리 수의 나머지 85가 나오고,
    이 값을 /10 을 하면 몫인 8이 반환된다.
  • 백의 자리 숫자 3을 구하기 위해서 385/100을 하면 몫인 3이 반환된다.




두번째 방법은 2가지 입력 방식으로 결과를 출력해서 성능을 비교해 보려고 한다.

     ① Scanner 클래스 사용
     ② BufferedReader 클래스 사용


① Scanner 클래스 사용

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%100/10));
        System.out.println(A*(B/100));
        System.out.println(A*B);
    }
}

위와같이 객체를 생성할 때, Scanner(System.in) 에서 System.in 은 입력한 값을 Byte 단위로 읽는 것을 뜻한다.

nextInt() 메서드를 사용해 int형으로 입력받아 저장한다.





② BufferedReader 클래스 사용

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int A = Integer.parseInt(br.readLine());
        int B = Integer.parseInt(br.readLine());
        
        System.out.println(A*(B%10));
        System.out.println(A*(B%100/10));
        System.out.println(A*(B/100));
        System.out.println(A*B);
    }
}

BufferedReader는 입력값을 한 줄로 읽은 후 문자열로 반환한다.
그래서 int형 변수에 값을 저장하려면 int형으로 형 변환을 해줘야한다.
Integer 클래스의 parseInt()라는 메소드를 사용하면 되는데, 숫자형식의 문자열을 정수형으로 반환해주는 역할을 한다.

BufferedReader 클래스에 대해 더 알아보고 싶으면 여기를 클릭하면 된다.




3. Scanner VS BufferedReader 성능 비교

img2

입력의 경우 확실히 Scanner 보다는 BufferedReader 가 빠른 것을 볼 수 있다.





관련 페이지




Categories:

Updated:

Leave a comment