[백준] 진법 변환

이정연·2023년 3월 19일
0

CodingTest

목록 보기
134/165

[Bronze II] 진법 변환 - 2745

문제 링크

성능 요약

메모리: 113112 KB, 시간: 116 ms

분류

수학, 구현, 문자열

문제 설명

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

설계

main

if __name__ == '__main__':
    N,B = input().split()
    print(convert(N,int(B)))

N을 입력받아 B진법으로 변환하는 함수 convert를 제작하여 정답을 출력하도록 설계했다.

convert

def convert(num,b):
    answer = 0
    alpha_to_num = dict()

    for i in range(65,b+55):
        alpha_to_num[chr(i)] = i-55
    
    for i in range(len(num)):
        try:
            answer += int(num[i])*(b**(len(num)-1-i))
        except:
            answer += alpha_to_num[num[i]]*(b**(len(num)-1-i))
    return answer

ASCII CODE에 따르면 A = 65 이다.

B진법은 ASCII CODE의 B+54 번호의 알파벳까지 있다.

무슨 소리냐 하면, 16진법은 F = 15 까지 있다.

F는 아스키 코드로 70이고 이는 16+54 = 70이다.

따라서, 알파벳을 key, 숫자를 value로 가지는 dictionary를 생성한다.

그리고 N을 한 글자씩 돌면서 B진법으로 변환하여 해당 자리수에 맞는 숫자를 곱한다.

예를 들어, N = 1A5, B = 16이라면
N을 10진법으로 변환한 수는
1x(16^2)+10x(16^1)+5x(16^0) 이다.

전체 코드

def convert(num,b):
    answer = 0
    alpha_to_num = dict()

    for i in range(65,b+55):
        alpha_to_num[chr(i)] = i-55
    
    for i in range(len(num)):
        try:
            answer += int(num[i])*(b**(len(num)-1-i))
        except:
            answer += alpha_to_num[num[i]]*(b**(len(num)-1-i))
    return answer

if __name__ == '__main__':
    N,B = input().split()
    print(convert(N,int(B)))
profile
0x68656C6C6F21

0개의 댓글