Algorithm/Baekjoon(Java)

[백준/JAVA] 2588 : 곱셈 ( toCharArray(), char - '0')

비망노트 2022. 6. 30. 22:17
문제

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

(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