B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오.
10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.
첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36)
B진법 수 N을 10진법으로 바꾸면, 항상 10억보다 작거나 같다.
첫째 줄에 B진법 수 N을 10진법으로 출력한다.
ZZZZZ 36
60466175
// 진법 변환
package _00_TodayProblem.tp02._05_2745;
import java.util.*;
import java.io.*;
public class Solution {
static int bToDecimal(char ch) {
if (ch >= '0' && ch <= '9') {
return ch - '0';
} else {
return ch - 'A' + 10;
}
}
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("src/_00_TodayProblem/tp02/_05_2745/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
String N = st.nextToken();
int B = Integer.parseInt(st.nextToken());
int sum = 0;
for (int i = 0; i < N.length(); i++) {
int num = bToDecimal(N.charAt(i));
sum = sum * B + num;
}
System.out.print(sum);
br.close();
}
}
bToDecimal
- Java에서는 문자끼리 연산하면
ascii값으로 반환된다.ascii순서만 안다면, 일관된 값을 반환할 수 있다.ascii순서
0 ~ 9, A ~ Z, a ~ b- 문자가
0~9사이로 들어왔을 때
- 문자 그대로 출력하면 되니, 문자형
0을 빼서 정수형0을 반환한다.- 문자가
A~Z사이로 들어왔을 때
- 들어온 문자에 대해 알파벳 중 최솟값인
A를 빼서A의 값이0이 되도록 한다.- 이 때
0~9사이의 값 뒤로 알파벳을 배치해야 올바른 정렬이 된다. 따라서,+10을 한다.
main
- 진법을 계산하는 공식은 다음과 같다
- ex) 8진수 :
abcde
e값의 범위 :0 ~ 7=8⁰ × (0 ~ 7)d값의 범위 :8 ~ 56=8¹ × (0 ~ 7)
...a값의 범위: 4,096 ~ 28,672 =8⁴ × (0 ~ 7)- 즉,
8ⁱ × 변환된 값(0 ~ 7 사이의 값)이 된다.bToDecimal함수로 변환된 값을num변수에 받고, 예시 입력을 적용시키면,
Bⁱ * num이라는Java공식이 나온다.- 이 때
i = 4, 3, 2, 1, 0이라면
B⁴ * num + B³ * num + B² * num + B¹ * num + B⁰ * num= ((((num * B + num)B + num)B * num)B + num(이 때 각 num의 값은 같거나 다를 수 있음)- 이 되는데, 반복횟수에 따라서 동일한 제곱값을 갖는 걸 알 수 있다.
- 이 계산 방법이 바로
sum = sum * B + num;에 해당하는 내용이다.