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

(1)과 (2)위치에 들어갈 세 자리 자연수가 주어질 때 (3), (4), (5), (6)위치에 들어갈 값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 (1)의 위치에 들어갈 세 자리 자연수가, 둘째 줄에 (2)의 위치에 들어갈 세자리 자연수가 주어진다.
출력
첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.
| 예제 입력 | 예제 출력 |
| 472 385 |
2360 3776 1416 181720 |
⭕ 풀이 1
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
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()); // 385
int result = a*b;
int multiply1 = a*(b%10);
b /= 10; // 38
int multiply2 = a*(b%10);
b /= 10; // 3
int multiply3 = a*(b%10);
System.out.println(multiply1);
System.out.println(multiply2);
System.out.println(multiply3);
System.out.println(result);
}
}
⭕ 풀이 2
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
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());
String b = br.readLine(); // 385
String[] strArr = b.split("");
int[] numArr = new int[strArr.length];
for(int i=0;i<strArr.length;i++){
numArr[i] = Integer.parseInt(strArr[i]);
}
int result = a*Integer.parseInt(b);
int multiply1 = a*numArr[2];
int multiply2 = a*numArr[1];
int multiply3 = a*numArr[0];
System.out.println(multiply1);
System.out.println(multiply2);
System.out.println(multiply3);
System.out.println(result);
}
}
✅ 이전에 Node.js로 풀어볼때 split을 공백이아닌 "" 로 분리할 수 있던게 생각나서
StringTokenizer로 풀고 다시 split으로 시도해보았다.
시간도 StringTokenizer에 비해 더 오래걸리고 ""로 분리가 되긴되는데 파싱과정이 너무 불필요하게 길어진느낌이 든다.
아직 많이 어색하지만 불가피한 경우가 아니라면 StringTokenizer를 활용한 풀이로 풀어보는 습관을 들여봐야겠다
✅ 다른분의 풀이
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int a = Integer.parseInt(br.readLine());
String str = br.readLine();
br.close();
char[] c = str.toCharArray();
System.out.println(a * (c[2] - '0'));
System.out.println(a * (c[1] - '0'));
System.out.println(a * (c[0] - '0'));
System.out.println(a * Integer.parseInt(str));
}
}
내가 먼저 푼 뒤 다른분들의 코드를 둘러보는건 항상 신기하고
이런 저런 메소드들도 구경하게되고 어떤흐름으로 풀었는지 보는게 재미있다.
✅ toCharArray();
문자열을 char 문자형 배열로 반환시켜주는 코드이다.
public class Main {
public static void main(String[] args) {
String str = "hello world";
char[] arr = str.toCharArray();
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
}
// output : h e l l o w o r l d
보면 알 수 있듯이 hello world 사이의 공백도 문자로 인식하고 반환해준다.
✅ c[2] - '0'
그렇다면 이건 무슨 코드일까?
위에서 살펴본 toCharArray로 예제를 기준으로 c[0]은 3 , c[1]는 8, c[2]는 5가 들어가있다
하지만 주의해야할점은 이것들은 char배열이기때문에 숫자가 아니라 char타입인것이다.
그렇기떄문에 c[2]는 문자 '5' 인데 이것을 숫자 5 로 바꾸고싶다
public class Main {
public static void main(String[] args) {
String str = "12345";
char[] arr = str.toCharArray();
System.out.println(arr[2]);
System.out.println(arr[2]- 0);
System.out.println(arr[2]-'0');
System.out.println(arr[2]-'0'+5);
}
}
/* output
3 // 문자
51 // 숫자
3
8
*/
아스키코드에서 숫자0은 48로 표현된다.
즉 문자 '3'는 아스키코드상에서 51인데 여기에서
숫자0을 빼면 int형으로 형변환이되어 숫자 51 이 나오게되고
문자'0'을 빼면 문자0인 48이빠지게되므로 문자3 이 나온다
하지만 여기서 arr[2] - '0' + 5 를 보면 알 수 있듯 숫자와 연산을 하게되면
int형으로 자동형변환이 되기때문에 문제에서 int형인 a와 곱해서 정수형으로 형변환된것이다.
어떻게 하면 가독성이 더 좋고 간략히 작성 할 수 있을까 하고 다른분들의 코드를 보다가
처음보는 풀이방식이라 신기해서 가져와보았다.
-출처
https://www.acmicpc.net/problem/2588
'Algorithm > Baekjoon(Java)' 카테고리의 다른 글
| [백준/JAVA] 1330 : 두 수 비교하기 (0) | 2022.07.02 |
|---|---|
| [백준/JAVA] 25083 : 새싹 (0) | 2022.07.01 |
| [백준/JAVA] 10430 : 나머지 ( new StringTokenizer(br.readLine()); ) (0) | 2022.06.29 |
| [백준/JAVA] 18108 : 1998년생인 내가 태국에서는 2541년생?! (0) | 2022.06.28 |
| [백준/JAVA] 10926 : ??! (0) | 2022.06.27 |