[BaekJoon] 2588번 - 곱셈 (java)
1. 문제
👉 문제 바로가기
- 조건
시간 제한 | 메모리 제한 |
---|---|
1초 | 128MB |
- 문제
(세 자리 수) × (세 자리 수)는 다음과 같은 과정을 통하여 이루어진다.
(1)과 (2)위치에 들어갈 세 자리 자연수가 주어질 때 (3), (4), (5), (6)위치에 들어갈 값을 구하는 프로그램을 작성하시오.
- 입력
첫째 줄에 (1)의 위치에 들어갈 세 자리 자연수가, 둘째 줄에 (2)의 위치에 들어갈 세자리 자연수가 주어진다.
- 출력
첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.
- 예제
입력 | 출력 |
---|---|
472 385 |
2360 3776 1416 181720 |
2. 풀이
이 문제는 입력된 숫자의 자리수를 분리
하여 연산을 할 수 있는지 확인하는 문제다.
처음 입력받은 세자리 자연수에 두번째 입력받은 세자리 자연수를 분리하여 각각 곱한 값을 출력한 뒤,
원래 식의 결과값을 출력하는 문제이다.
문제 접근 방법을 2가지로 나누어 설명하고자 한다.
- 두번째 숫자를 문자열로 입력받고
chatAt()
를 사용해 각 자릿수의 숫자를 하나씩 꺼내쓰는 방법 나누기와 나머지 연산
을 통해 각 자릿수의 숫자를 구하는 방법
- 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이다.
그렇다면 아스키코드로 변환하지 않고 숫자 그대로를 출력하고 싶으면 어떻게 해야할까?
이제 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와 곱해 원래 식의 결과를 출력한다.
- 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 성능 비교
입력의 경우 확실히 Scanner 보다는 BufferedReader 가 빠른 것을 볼 수 있다.
관련 페이지
Leave a comment