일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 알고리즘
- Java
- 백준
- sort정렬
- 핸드폰 가리기
- 자바
- 프로그램서
- Android Studio
- 27866
- Iterator
- JDK
- Eclipse
- SQL코딩테스트
- mysql
- 맥북
- 코딩테스트
- 해시
- 노선별 평균 역 사이 거리 조회하기
- 문자열 숫자 변환
- 깃허브
- HashMap
- github
- MAC OS
- OAuth 인증
- homebrew
- 포맷 지정자
- 가격이 제일 비싼 식품의 정보 출력하기
- 안드로이드 스튜디오
- M1
- 프로그래머스
- Today
- Total
개발일지
[백준 JAVA] 2588번: 곱셈 본문
문제
풀이
<접근법>
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번은 복잡해서 다음에..ㅎ
참고)
'Java > 알고리즘 공부' 카테고리의 다른 글
[백준 JAVA] 10950번: A + B - 3 / 8393번: 합 / 25304번: 영수증 (0) | 2023.01.27 |
---|---|
[백준 JAVA] 2884번: 알람시계 / 2525번: 오븐 시계 / 2480번: 주사위 세개 (0) | 2023.01.27 |
[백준 JAVA] 3003번: 킹, 퀸, 룩, 비숍, 나이트, 폰 (1) | 2022.12.19 |
[백준 JAVA] 1000번: A+B / 1001번: A-B / 10998번:AxB / 1008번: A/B (1) | 2022.12.18 |
[백준 JAVA] 2557번: Hello World (0) | 2022.12.18 |