개발일지

[백준 JAVA] 2588번: 곱셈 본문

Java/알고리즘 공부

[백준 JAVA] 2588번: 곱셈

O'mil 2022. 12. 20. 23:30
728x90
문제


풀이

<접근법>

1. 세 자리 자연수 A, B를 입력 받는다.

2. B를 한 자리씩 자른다.

3. 각각 곱한다.

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		
		Scanner in = new Scanner(System.in);
		
		int A = in.nextInt();
		int B = in.nextInt();
		
		in.close();
	}
}

-  두 수를 입력 받는 코드까지는 작성을 했지만 B를 어떻게 한 자리씩 잘라야 할지 감이 잡히지 않았다.


<풀이 방식>

1. 문자열로 입력받아 charAt()으로 하나씩 꺼내 쓰는 방법

2. 나머지와 나눗셈 연산을 통해 각 자릿수를 구하여 쓰는 방법

3. 문자열을 character 배열로 한 자리씩 넣어주어 이용하는 방법

(1, 3번은 문자열로 입력 받기 때문에 연산을 위해 int형으로 변환해주어야 한다.)

 

# 풀이 1

- 풀이 방식을 보는 순간 2번은 풀 수 있겠다는 생각을 했다.

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		
		Scanner in = new Scanner(System.in);
		
		int A = in.nextInt();
		int B = in.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);

		in.close();
	}
}

<풀이방법 2>

- A, B를 정수형으로 입력 받는다.

- B의 1의 자리는 10으로 나눈 것의 나머지이고

- 십의 자리는 100으로 나눈것의 나머지를 10으로 나눈 것 (몫)

- 백의 자리는 100으로 나눈 것의 몫

- 최종은 A x B


# 풀이 2

import java.util.Scanner;

public class Main {

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

		in.close();
	}
}

<풀이방법 1>

- A는 int로 B는 String으로 입력받아 준다.

- charAt()을 이용해 각 자리수를 참조해준다.

 

+) charAt()

- charAt()은 문자열을 문자들이 모인 배열이라고 보고 인덱스를 참조하여 해당 문자를 반환한다.

- 이때 반환되는 값은 아스키코드값인 문자 (char)이다.

 

ex)

String a = 123;

int b = a.charAt(0);

- 이라고 한다면 b의 값이 1이 나온다고 생각할 수 있다.

- 그러나, String으로 입력받은 1을 int형으로 변환 시키므로 '1' 이 아닌 ASCII의 49이 저장되게 된다.

 

+ 뒤에 - '0'을 해주는 이유는 0의 ASCII 코드 값은 48이다.

49 - 48 = 1로 우리가 원하는 숫자 값이 나오므로 0을 빼주어 만들어 주는 것이다.

* 숫자 0이 아닌 문자 '0'을 빼줘야 하므로 따옴표 잊지 말기!!!

 

궁금증은 더보기 클릭!

더보기

<궁금증>

// 1
System.out.println(B.charAt(0));

// 2
System.out.println(B.charAt(0) - '0');

위에 두 코드를 출력해봤는데 둘다 3으로 같은 결과값이 나온다.

왜...? 진짜 궁금... '1번은 51이 출력되어야 하는거 아닌가?'

해서 찾아보니

 

- 바로 ASCII 코드가 출력이 되는게 아니라 연산 시 ASCII 코드에 해당하는 숫자로 연산이 되는 것이었다.

- 1번은 char 3, 2번은 int 3

- 여기서 연산이 들어간다면 1번은 51로 계산이 되고 2번은 3으로 계산이 들어가는 것이다.

 

// 3
System.out.println(B.charAt(0) - 0);

// 4
System.out.println((B.charAt(0) - '0') - 0);

 - 숫자 0을 빼서 확인해 보니

3번은 51이 나오고 4번은 3이 나온 걸 확인 할 수 있었다.

 

 

<결과>

1. charAt()은 char을 리턴한다.

2. 숫자와 연산이 되면서 int형으로 바뀌는데 이 때 문자에 해당하는 ASCII 코드값으로 바뀌는 것이다.

 

- AxB를 해준다.

+) Integer.parseInt()

- 문자열을 숫자로 바꿔준다.

- 입력받은 B의 값을 숫자 그대로 바꿔 A 와 곱해준다.

 

ASCII 코드 더보기 클릭!!

더보기

<아스키 코드 참고>

 

# 풀이 3

3번은 복잡해서 다음에..ㅎ


참고)

https://st-lab.tistory.com/20

https://stepbystep1.tistory.com/10

https://cokes.tistory.com/80

https://velog.io/@geonu/CharAtint-i를-이용한-계산식에서-0이-필요한-이유

728x90
Comments