IT/BaekJoon

[백준/JAVA] 2588번. 곱셈 문제 - charAt는 뭐고 왜 쓰는 걸까?

Buang 2023. 1. 1. 21:11
반응형

1. 문제

https://www.acmicpc.net/problem/2588

 

2588번: 곱셈

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

www.acmicpc.net

 

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

 

 

(1)과 (2)위치에 들어갈 세 자리 자연수가 주어질 때

(3), (4), (5), (6)위치에 들어갈 값을 구하는 프로그램을 작성하시오.

 

 


2. 정답

 

import java.util.Scanner;
 
public class Main {
 
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
 
		int A = scan.nextInt();
		String B = scan.next();
        
		scan.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));
 
	}
}

 

 


3. 풀이

 

scanner와 charAt에 대해서 알고 있으면 쉽게 풀 수 있는 문제다.

 

scanner에 대한 글은 이 '링크' 글을 클릭하면 볼 수 있다.

 

아래 글은 scanner를 알고 있다는 가정하에 작성된 글이다.

 

 

Scanner scan = new Scanner(System.in);
 
int A = scan.nextInt();
String B = scan.next();

 

총 2개의 3자리 수를 입력받기 때문에 Scanner 클래스를 사용했다.

 

여기서 의아할 수 있는 부분은 첫 번째로 입력받는 수는 int A로 즉

int 형으로 저장하는 데 반해 아래에 String B를 보면 

int형이 아닌 String으로 두 번째 숫자를 받아오는 걸 확인할 수 있다.

 

472X385를 한다고 했을 때 472는 int 형으로

385는 String으로 받아온 것이다.

 

두 숫자 모두 정수니까 두 개 모두 int형이면 될 텐데

왜 하나는 int로 다른 하나는 String으로 한 걸까?

 

이 문제에선 charAt를 사용해야 하기 때문이다.


3-1. charAt

 

1) charAt를 소개하는 이유

 

charAt는 string 타입을 char 타입으로 변환할 때 사용하는 함수다.

이 함수를 소개하는 이유는 프로그램에서 원하는 결과 값 때문이다.

 

만약 472 X 385를 계산한다고 했을 때 총 4개를 우리는 결과로 출력되도록 만들어어ㅑ 한다.

 

1번. 472 X 3  = 결과 1

2번. 472 X 8  = 결과 2

3번 472 X 5 = 결과 3

4번. 472X385 = 결과 4

 

여기서 결과 1번 ~ 결과 3번을 출력하기 위해선

385라는 덩어리를 3 / 8 / 5 이렇게 한 개씩 쪼개준 뒤

1번 ~ 3번처럼 곱해지는 연산을 해줘야 한다.

 

이렇게 쪼개주는 기능을 가지고 있는 게 바로 charAt 다.

 


2) charAt 사용 예시

 

String A = "부엉이요";

 

내가 위와같이 '부엉이요'라는 문자열을 작성했다고 했을 때

이 '부엉이요'를 한 개씩 쪼개고 싶다면 아래와 같이 작성하면 된다.

 

A.charAt(0); // 부

A.charAt(1); // 엉

A.charAt(2); // 이

A.charAt(3); // 요

 

출력 코드를 확인하고 싶다면 아래 '더보기'를 확인하면 될 것 같다.

 

더보기
public class Main {
	public static void main(String[] args) {

    String A = "부엉이요";
   
    System.out.println(A.charAt(0)); //부
    System.out.println(A.charAt(1)); //엉
    System.out.println(A.charAt(2)); //이
    System.out.println(A.charAt(3)); //요

    
	}
}

 

 

 

이젠 이렇게 글자를 쪼개는 대신 숫자를 쪼개보자.

 

public class Main {
	public static void main(String[] args) {

    String B = "385"; //385 쪼개기
   
    System.out.println(B.charAt(0)); // 문자 3
    System.out.println(B.charAt(1)); // 문자 8
    System.out.println(B.charAt(2)); // 문자 5

    
	}
}

 

385라는 숫자를 한개씩 쪼개고자 위와같이 코드를 작성했다.

 

 

위와 같이 작성하면 사진처럼 문제없이 

3 8 5 가 쪼개져서 나온다.

 

하지만 여기서 주의할 건 위의 3 8 5가 숫자가 아니라 문자라는 것이다.

 


3) 문자 3은 사실 짝퉁이다.

 

코드를 쓸 때 385가 한개씩 쪼개졌으면 해서

String B = "385";라고 작성했다.

int B = 385; 라고 작성하지 않았다.

 

그렇기에 위의 이미지에서 보이는 3은 사실 숫자 3이 아니다.

숫자 3의 탈을 쓴 숫자 51이다!

왜냐면 문자 3을 숫자로 바꾸면 숫자 51이 되기 때문이다.

 

제대로 된 숫자 3을 원한다면 해줘야 할 작업이 있다.

바로 문자 0을 빼주면 된다.

 

문자 0('0')은 숫자로 바꾸면 48이 된다.

문자 3에서 문자 0을 뺀다는 건

숫자 51에서 숫자 48을 뺀다는 말과 같다.

51 - 48 = 3이다.

 

우리가 원하는 제대로 된 숫자 3이 나오는 것이다.

 

public class Main {
	public static void main(String[] args) {

    String B = "385"; //385 쪼개기
   
    System.out.println(B.charAt(0) - '0'); // 숫자 3
    System.out.println(B.charAt(1) - '0'); // 숫자 8
    System.out.println(B.charAt(2) - '0'); // 숫자 5

    
	}
}

 

위의 코드처럼 문자 0( - '0')을 빼주면 된다.

이렇게 문자 0을 빼주면 문자가 아닌 제대로 된 숫자가 나오는 것이다.

 

472 X 385를 계산한다고 했을 때

 

1번. 472 X 3  

2번. 472 X 8 

3번 472 X 5

4번. 472 x 385

 

총 4개의 값을 원했으니 최종적으로 아래처럼 코드를 작성하면 될 것이다.

 

import java.util.Scanner;
 
public class Main {
 
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
 
		int A = scan.nextInt();
		String B = scan.next();
        
		scan.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));
 
	}
}

 

마지막에 Integer.parseInt가 보인다.

문자열을 정수(int)형으로 바꿔주는 것이다.

 

Integer.parseInt("3000");

이라고 써져있다면 문자 3000을 숫자 3000으로 바꿔주는 것이다.

 

숫자와 문자는 곱할 수 없고, 

숫자와 숫자끼리 곱할 수 있기에

위와 같은 작업이 필요하다.

 

 

 

반응형