반응형
입력받은 수 b진법수 n을 10진법으로 출력하는 문제.
위 예제에서 보듯이 ZZZZZ 라는 36진법 수가 있다고 하면 이를 10진수로 바꾸는 과정은 다음과 같다.
먼저 Z라는 수는 36진법에서 35번째 수이다.
5번째 Z : 35 x 1 = 35
4번째 Z : 35 x 36 = 1,260
3번째 Z : 35 x 36^2 = 45,360
2번째 Z : 35 x 36^3 = 1,632,960
1번째 Z : 35 x 36^4 = 58,786,560
이를 모두 더하면 60,466,175 라는 값이 나오게 된다.
이를 공식화하게 되면
n번째 수 : 해당수 x 1
n-1번째 수 : 해당수 x 진법
n-2번째 수 : 해당수 x 진법^2
...
이 될 것이다.
이를 반복문으로 나타내면 다음과 같다
int tmp = 1;
for (int i = n.length() - 1; i >= 0; i--) {
char c = n.charAt(i);
if (c >= 'A' && c <= 'Z') {
result += (c - 55) * tmp;
} else {
result += (c - 48) * tmp;
}
tmp *= b;
}
- 곱셈을 위한 변수 tmp를 만들어 1로 초기화한다.
- length()함수를 이용해 주어진 문자열의 길이를 반환받아 0이 될때까지 반복하는 for문을 작성한다.
- 반복문을 돌면서 주어진 문자열의 뒷부분부터 하나씩 잘라내어 이 값을 비교한다.
- 만약 알파벳 범위 안의 문자라면 55를 빼고(아스키코드에서 A는 65. 10이 A가 되므로 65 - 10 = 55)
이 값을 tmp와 곱한다. - 알파벳이 아니라면 48을 빼고(아스키코드에서 0은 48) 이 값을 tmp와 곱한다.
- tmp에 입력받은 진법 b 를 곱한다.
전체 코드는 다음과 같다.
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
String n = sc.next();
int b = sc.nextInt();
int tmp = 1;
int result = 0;
for (int i = n.length() - 1; i >= 0; i--) {
char c = n.charAt(i);
if (c >= 'A' && c <= 'Z') {
result += (c - 55) * tmp;
} else {
result += (c - 48) * tmp;
}
tmp *= b;
}
System.out.println(result);
sc.close();
}
}
반응형
'Java > 백준알고리즘' 카테고리의 다른 글
[Java] 백준알고리즘 #2720 세탁소 사장 동혁 (2) | 2023.10.05 |
---|---|
[Java] 백준알고리즘 #11005 진법 변환 2 (0) | 2023.10.05 |
[Java] 백준알고리즘 #2563 색종이 (1) | 2023.10.04 |
[Java] 백준알고리즘 #10798 세로읽기 (0) | 2023.10.04 |
[Java] 백준알고리즘 #2566 최댓값 (0) | 2023.10.04 |