https://www.acmicpc.net/problem/2588
Question
(세 자리 수) × (세 자리 수)는 다음과 같은 과정을 통하여 이루어진다.
(1)과 (2)위치에 들어갈 세 자리 자연수가 주어질 때 (3), (4), (5), (6)위치에 들어갈 값을 구하는 프로그램을 작성하시오.
Input
첫째 줄에 (1)의 위치에 들어갈 세 자리 자연수가, 둘째 줄에 (2)의 위치에 들어갈 세자리 자연수가 주어진다.
Output
첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.
Example
input
472
385
output
2360
3776
1416
181720
Answer 1
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 input1 = Integer.parseInt(br.readLine());
String input2 = br.readLine();
int res = 0;
for (int i=input2.length()-1; i>=0; i--) {
int mul = input1 * Character.getNumericValue(input2.charAt(i));
res += mul * (Math.pow(10, input2.length()-1-i));
System.out.println(mul);
}
System.out.println(res);
br.close();
}
}
Answer 1 - Code Explanation
이 코드는 곱셈할 때 자리수의 확장을 고려하여 코딩했다.
for (int i=input2.length()-1; i>=0; i--) {
int mul = input1 * Character.getNumericValue(input2.charAt(i));
res += mul * (Math.pow(10, input2.length()-1-i));
System.out.println(mul);
}
(2) 숫자를 문자열로 받은 길이를 사용하여 index로 자리수를 구했다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader 클래스는 Buffer에 있는 IO 클래스로 데이터를 버퍼에 저장해두었다가 한번에 입력하는 방식으로 동작한다.
즉, 데이터를 하나씩 입력하는 것이 아니라 한번에 입력하므로 속도가 빠르다.
(입출력이 많은 코드나 데이터 양이 많은 경우에서 지향하는 방식이다.)
br.close();
Java에서는 GC를 통해서 Java 내의 객체 및 리소스들이 자동으로 정리되기 때문에 close()를 하지 않아도 큰 문제가 발생하지 않는다.
하지만 GC가 자동으로 모두 완료될 때까지 BufferedReader에 할당된 리소스들이 그대로 유지되고 있다.
따라서 최적화면에서 사용을 다한 BuffeedReader 들은 close()를 선언하여 스트림을 닫아주는 것이 좋다.
Answer 2
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 input1 = Integer.parseInt(br.readLine());
String input2Str = br.readLine();
int input2 = Integer.parseInt(input2Str);
int res = 0;
for(int i=0; i<input2Str.length(); i++) {
int mul = input1 * ((input2 % (int)Math.pow(10, i+1)) / (int)Math.pow(10, i));
System.out.println(mul);
res += mul * (int)Math.pow(10, i);
}
System.out.println(res);
br.close();
}
}
Answer 2 - Code Explanation
이 코드는 곱셈할 때 자리수의 확장을 고려하여 코딩했다.
for(int i=0; i<input2Str.length(); i++) {
int mul = input1 * ((input2 % (int)Math.pow(10, i+1)) / (int)Math.pow(10, i));
System.out.println(mul);
res += mul * (int)Math.pow(10, i);
}
(2) 숫자를 문자열로 받은 길이를 사용하여 '/' 연산자로 자리수를 구했다.
Answer 3
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 input1 = Integer.parseInt(br.readLine());
int input2 = Integer.parseInt(br.readLine());
System.out.println(input1 * (input2 % 10));
System.out.println(input1 * (input2 % 100 / 10));
System.out.println(input1 * (input2 / 100));
System.out.println(input1 * input2);
br.close();
}
}
Answer3 - Code Explanation
이 코드는 주어진 수를 직관적으로 코딩했다.
Organize
세 답안 모두 BufferedReader 클래스를 사용해서 해당 문제로는 큰 성능 차이가 없어보인다.
하지만 곱셈한 수의 자리수가 늘어나면 늘어날수록 추가해야되는 Answer1 보다 Answer2, 3를 선택하겠다.
개인적으로 Answer2, 3 중에서는 Char 타입을 Integer로 형변환을 하지 않는 Answer2가 좋을 것 같다.
Reference
https://ontheway.tistory.com/63