코딩테스트

백준 2745번 파이썬 - 진법 변환

해파리냉채무침 2024. 3. 22. 17:01

https://www.acmicpc.net/problem/2745

 

2745번: 진법 변환

B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오. 10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 

www.acmicpc.net

문제

 

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진법으로 출력한다.

예제 입력 1 복사

ZZZZZ 36

예제 출력 1 복사

60466175

 

처음 내가 짠 코드 1)

N, B = input().split()
alpha= {'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14,
       'F': 15, 'G': 16, 'H': 17, 'I': 18, 'J': 19,
       'K': 20, 'L': 21, 'M': 22, 'N': 23, 'O': 24,
       'P': 25, 'Q': 26, 'R': 27, 'S': 28, 'T': 29,
       'U': 30, 'V': 31, 'W': 32, 'X': 33, 'Y': 34,
       'Z': 35}
N= list(N)
B= int(B)
num = 0
for i,d in enumerate(N):
    num += alpha[d]* B**i
print(num)

이렇게 했더니 계속 keyError가 나는것이다. 원인을 찾아봤더니 이진법은 오른쪽 글자에서 왼쪽으로 n의0승, n의 1승, n의 2승,,, 이런식으로 간다. 그러므로 글자를 담은 N을 뒤집어줘야 한다(N.reverse). 또한 i,d를 enumerate로 받았기 때문에

d가 숫자인 경우와 알파벳인 경우를 구분지어줘야한다. 나는 처음에 d가 무조건 string 문자열인 경우만 고려했기 때문에 계속 keyerror가 나는 것이었다. d가 숫자일때 그수를 그대로 곱해준다.

 

 수정한 코드

N, B = input().split()
alpha= {'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14,
       'F': 15, 'G': 16, 'H': 17, 'I': 18, 'J': 19,
       'K': 20, 'L': 21, 'M': 22, 'N': 23, 'O': 24,
       'P': 25, 'Q': 26, 'R': 27, 'S': 28, 'T': 29,
       'U': 30, 'V': 31, 'W': 32, 'X': 33, 'Y': 34,
       'Z': 35}
N = list(N)
B = int(B)
num = 0
N.reverse()  # N을 뒤집어서 가장 낮은 자리수부터 계산
for i, d in enumerate(N):
    if d.isdigit():  # 숫자인 경우
        num += int(d) * B**i
    else:  # 알파벳인 경우
        num += alpha[d] * B**i
print(num)

앞으로 keyError나 런타임에러같이 출력만 볼게 아니고..!! 다양한 에러에 대비해서 코드를 짜고 if문을 써서 통상적으로 포용할수 있는 코드를 짜야겠다.