Study/Baekjoon Online Judge
[백준/파이썬] 2745. 진법 변환
growingtree
2021. 8. 10. 23:42
728x90
문제
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진법으로 출력한다.
아이디어
2진수 '1010'를 10진수 '10'으로 바꿀 때 어떻게 했는지 생각을 해보면 답이 쉽게 풀릴 것 같다.
> 진수를 밑으로 두고 자릿수를 지수 자리로 둔 다음, 해당 자릿수의 값들과 곱한다!
▼자세한 내용은 아래 블로그 참고▼
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=brinson&logNo=220685807322
같은 방법으로 36진수인 ZZZZZ도 계산하면 답이 일치한다.
코드
N,B = input().split(" ")
N = ''.join(reversed(N))
B = int(B)
number = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
result = 0
for x in range(len(N)-1,-1,-1):
sum = number.index(N[x]) * (B**x)
result += sum
print(result)
해설
N,B = input().split(" ")
#2진수 1010의 경우, 첫째자리 1에 2의 4승이 곱해져야하므로 뒤집어서 계산.
#아래 반복문을 효과적으로 사용하기 위함임.
N = ''.join(reversed(N))
B = int(B)
#36진법에 해당하는 숫자와 알파벳을 담은 문자열 하나 만들기
number = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
result = 0
# 반복문을 뒤집어서 실행
# 만약 N의 길이가 5이면, 5,4,3,2,1,0 순으로 x에 대입.
# range 안에 (시작, 마지막, -1) <- -1을 마지막에 적으면 거꾸로 for문이 돌아감.
for x in range(len(N)-1,-1,-1):
# 해당 문자열에 해당하는 인덱스 값을 구하고 진수에 x에 해당하는 제곱을 곱한다.
# N[0]이 Z이고, B가 36일 때, number.index(N[x]) 는 35가 되고 , (B**x) 는 36의 0제곱이 된다.
sum = number.index(N[x]) * (B**x)
result += sum #result 변수에 계속 저장 (굳이 sum 변수를 안만들어 될 것 같음)
print(result)
생각보다 오래걸렸던 문제.;; 주어진 예시 말고 다른 예시도 직접 만들어보면서 모든 케이스에 대응하는 연습을 해야할 것 같다.
반응형