[백준/Python] 2745 - 진법 변환

Frye 'de Bacon·2023년 9월 30일
0

코딩테스트

목록 보기
5/45
post-thumbnail

문제

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 3660466175

풀이

설계

파이썬의 경우 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가 된다.
따라서 다음과 같은 순으로 코드를 짜 보았다.

  1. B진법의 수를 변환하기 위한 딕셔너리를 생성한다.
  2. 소수점이 있을 경우 정수와 소수부로 나눈다.
  3. 정수와 소수 각각에 대하여 [수, 자릿수]로 이루어진 리스트를 생성한다.
  4. (수 * 진수 ** 자릿수)를 적용하여 각 자리의 값을 10진수로 변환하고 이를 모두 더한다.

코드

# 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)))

대충 밥 로스 아저씨가 "참 쉽죠?" 하는 짤.

profile
AI, NLP, Data analysis로 나아가고자 하는 개발자 지망생

0개의 댓글