백준 - 진법 변환[2745]

1 분 소요

이번 포스팅에서는 백준 알고리즘의 진법 변환[2745] 코딩테스트 연습 문제를 풀어봅니다.

문제 설명

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

입출력 예

입력출력
ZZZZZ 3660466175

문제 풀이

오른쪽 끝부터 자릿수가 B(진법)^0 으로, 한자리씩 높아질수록 승수가 1씩 높아집니다. 자릿수에 진수를 10진수로 변환한 값(예: A:10)을 곱하여 모두 더해 주면 변환이 됩니다.

입력 받은 N에 대하여 리스트로 분할하여 리스트의 길이 만큼 자릿수를 구하여 계산 하고(36진수일 경우: 36^리스트길이-i-1) 진수 문자열에서 .index() 함수를 이용하여 진수값에 대한 10진수 값을 찾아내서 곱해주었습니다. 자릿수 만큼 루프를 반복하여 결과를 모두 더해 주어 문제를 해결 하였습니다.

Python 코드로 표현하면 아래와 같습니다. stdin을 사용할 경우 input()보다 연산 시간이 감소합니다.

from sys import stdin
import math

N, B = stdin.readline().split()
BS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
N = list(N)
Nlen = len(N)
answer = 0
for i in range(Nlen):
    answer += BS.index(N[i]) * int(math.pow(int(B), Nlen-i-1))
print(answer)

[입력]
ZZZZZ 36
[출력]
60466175

결과는 아래와 같이 잘 통과 되는 것을 확인 할 수 있습니다.

1

Python을 사용할 경우 int()함수는 진법변환의 기능을 제공하고 있어서 아래와 같이 간단하게 사용도 가능합니다.

from sys import stdin
N, B = stdin.readline().split()
print(int(N,int(B)))

결과는 아래와 같이 연산 시간도 감소 하는 것을 확인 할 수 있습니다.

2