B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오.
10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.
A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35
첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36)
B진법 수 N을 10진법으로 바꾸면, 항상 10억보다 작거나 같다.
첫째 줄에 B진법 수 N을 10진법으로 출력한다.
예제 입력 | 예제 출력 |
---|---|
ZZZZ 36 | 60466175 |
파이썬의 경우 int() 함수를 이용하면 말도 안 되는 수준으로 간단하게 - 입력받는 줄 하나, 출력하는 줄 하나, 두 줄로 해결 - 해결할 수 있지만, 목적이 그게 아니므로 손수 함수를 구현했다.
우선 n진수를 10진수로 변환하는 공식은 각 자리의 값과 각 자리의 지승의 승을 곱한 후 모두 더하는 것이다. 예를 들어 이진수 1111.11(2)는 (1*2^{3})+(1*2^{2})+(1*2^{1})+(1*2^{0})+(1*2^{-1})+(1*2^{-2}) = 15.75가 된다.
따라서 다음과 같은 순으로 코드를 짜 보았다.
# B진법 수를 변환하기 위한 딕셔너리를 생성
n_list = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
n_dict = {key: index for index, key in enumerate(n_list)}
n, base = input().split()
# 소수점이 있을 경우 둘로 구분
n_int, n_float = [], []
try:
n_int, n_float = n.split(".")
n_int = n_int.replace(".", "")
except:
n_int = n
temp_list = []
# 정수 부분에 대하여 변환을 위한 자리수 지정
for i in range(len(n_int)):
temp_list.append([n_dict[n_int[i]], len(n_int)-(1+i)])
# 소수 부분에 대하여 변환을 위한 자리수 지정
if n_float:
for i in range(len(n_float)):
temp_list.append([n_dict[n_int[i]], -(1+i)])
answer = 0
# 진수 변환
for i in temp_list:
answer += (i[0] * int(base) ** i[1])
print(answer)
워낙 수포자라 코드 자체보다는 각 진수의 변환을 이해하는 게 더 복잡하게 느껴졌던 문제. 파이썬의 경우 아래와 같이 두 줄만으로도 간단하게 해결할 수 있다.
n, b = input().split()
print(int(n, int(b)))
대충 밥 로스 아저씨가 "참 쉽죠?" 하는 짤.