Study/Baekjoon Online Judge

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

growingtree 2021. 8. 8. 21:45
728x90

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

문제

10진법 수 N이 주어진다. 이 수를 B진법으로 바꿔 출력하는 프로그램을 작성하시오.

10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.

A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35

 

입력

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36) N은 10억보다 작거나 같은 자연수이다.

 

출력

첫째 줄에 10진법 수 N을 B진법으로 출력한다.

 

아이디어

10진수를 원하는 진법으로 바꾸려면 나눗셈의 몫과 나머지가 필요하다는 점 

 

해결과정

1. 10진수를 원하는 진법으로 바꾸려면 숫자를 나눠서 나눗셈의 나머지를 진법에 맞게 변환해주면 된다.

ex) 10진수 숫자 10을 2진수로 바꾸려면 숫자를 계속 나눠서 나오는 나머지를 거꾸로 읽어주기만 하면 된다.

2. 10진법을 넘어가는 숫자들은 숫자로 표시할 수 없는 부분들이 존재한다. 그 부분은 알파벳으로 바꿔줘야하므로 나오는 나머지들을 알파벳으로 바꿔줘야한다. → 딕셔너리를 사용하면 되지 않을까? key를 나머지로 나오는 숫자로 하고, value를 알파벳으로 두면 되지 않을까 ?

 

3. while문을 사용해서 몫이 나누는 수보다 작아질 때 몫을 구하고 break , 그 외의 경우는 계속 나머지를 구하는 걸로 코드를 짜보자. 

#11005 진법 변환2 --> 복잡한 내 실패코드 TT 
#실패코드라 따로 주석을 달지는 않겠음 

import sys

def convert(N, B):
    number = dict()
    ascii_code = 65 # 아스키코드로 알파벳을 알아내려고 했음
    result = str()

    # 진법 변환을 위한 딕셔너리 생성 
    for n in range(0,B):
        if n >=10: # 10 이상으로 넘어가면 알파벳으로 표현하게끔 
                if n == 10:
                    number[str(n)] = chr(ascii_code)
                else: 
                    ascii_code +=1 
                    number[str(n)] = chr(ascii_code)
        else: # 그외는 그냥 value 값에 숫자를 문자형으로 변경해서 넣는다 
            number[str(n)] = str(n)

    
    while True:
        N = N//B
        remain = N%B

        if N < B: 
            result += number.get(str(N))
            result += number.get(str(remain))
            break
        else: 
            result += number.get(str(remain))
        

    return result[::-1]


N,B = map(int, sys.stdin.readline().split(" "))
print(convert(N, B))

코드가 틀린 이유 ? 

위와 같이 짜게 되면 첫번째 입력값이 들어왔을 때의 나머지를 구할 수 없게된다. 

반복문 안에 바로 나눠서 나온 몫을 넣기 때문에 첫번째 나머지가 생략된다. 

10진수 숫자 10을 2진수로 바꿀 때 10 // 2부터 해야하는데 5 // 2 부터 되는 코드를 짠거임..

 

코드

고민해도 잘 모르겠어서 그냥 구글링해서 해설 봄

https://duwjdtn11.tistory.com/486

import sys 


system = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
N, B = map(int, sys.stdin.readline().split())
answer =str() 

while N != 0:
    answer += system[N % B]
    N //= B
    
print(answer[::-1])

 

해설 

import sys 

#그냥 문자열로 나열하는게 더 효율적임 
system = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
N, B = map(int, sys.stdin.readline().split())
answer = str() #정답을 담을 str()
while N != 0: #몫이 0이 될 때 까지 (0이 되면 while문 중단) 
     #system 문자열의 인덱스 중 나머지와 같은 문자를 answer에 담는다. 
     # 만약 나머지가 4이면 system 문자열 안에서 인덱스 4에 해당하는 문자 반환 
    answer += system[N % B]
    N //= B # N//B (몫에 해당하는 값)을 다시 N에다가 대입해서 while문이 반복해서 돌게끔 한다. 
    
print(answer[::-1]) # 정답을 뒤집어서 출력 -> 위 진법 사진보면 이해가 될 것..
반응형