Study/Baekjoon Online Judge

[백준/파이썬] 2745. 진법 변환

growingtree 2021. 8. 10. 23:42
728x90

https://www.acmicpc.net/problem/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진법으로 출력한다.

 

아이디어

2진수 '1010'를 10진수 '10'으로 바꿀 때 어떻게 했는지 생각을 해보면 답이 쉽게 풀릴 것 같다.

> 진수를 밑으로 두고 자릿수를 지수 자리로 둔 다음, 해당 자릿수의 값들과 곱한다! 

 

▼자세한 내용은 아래 블로그 참고▼

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=brinson&logNo=220685807322 

 

수 체계와 진수 변환 (2진법, 8진법, 16진법)

0과 1을 위해서 진수변환을 배워본다. 2진수를 위해서 수 체계 공학에서 배울 수 체계는 2진수, 8진수, 16...

blog.naver.com

 

같은 방법으로 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)

생각보다 오래걸렸던 문제.;; 주어진 예시 말고 다른 예시도 직접 만들어보면서 모든 케이스에 대응하는 연습을 해야할 것 같다. 

반응형