백준 11005번 풀이

문제

10진수를 N진수로 변환하기

풀이

이거의 반대 버전이다. 변환하는 방법은 저기에 있으니 생략.

일단 로직 자체는 그렇게 어렵진 않다. 근데 코드를 보다보면 이게 뭔 개소린가 싶을 부분이 있으니 잘 따라오십셔.

import sys

a, N = map(int, sys.stdin.readline().split())

일단 입력이 두갠데 둘 다 int로 받을거다. 10진수라 알파벳이 없거든… 그래서 입력에 뭐 번거롭게 사족 달 건 없고 map으로 해결보면 된다.

over_ten_list = list(range(65,91))
over_ten_number = list(range(10,36))

그리고 저번 문제에서 봤던 이분이 또 왔다. 위 리스트는 아스키코드 번호고 아래는 10~35까지가 들어있는데, 저번 풀이에서는 알파벳을 아스키코드 번호로 바꿔서 숫자를 찾았다면 이번에는 역으로 숫자로 알파벳의 아스키코드를 찾아서 알파벳으로 바꿔서 출력할거다.

import sys

a, N = map(int, sys.stdin.readline().split())

over_ten_list = list(range(65,91))
over_ten_number = list(range(10,36))

jinsu_list = []

while a >= 1:
    jinsu_list.append(a % N)
    a = int(a / N)
    
jinsu = jinsu_list[::-1]
jinsu = ''.join(map(str,jinsu))
print(jinsu)

중요한게 하나 더 있다. 본인 풀이글을 봐 오신 분들은 아시겠지만 for문 가는데 while이 국룰이라고, 리스트 컴프리헨션 말고 어지간한 반복문으로 푸는 건 다 for버전과 while버전이 있는데 이건 while만 있다. 그리고 깃헙에 올린 코드도 while만 있다. 왜냐하면 얘는 더 이상 진수변환할 수 N으로 나누어 떨어지지 않을때까지만 해야 하거든…

2진수의 경우 최종적으로 몫이 1이 되면 중단하고, 16진수의 경우 몫이 15 이하가 되면 중단한다. 예를 들어서 31을 16진수로 변환한다면 처음에 31을 16으로 나눈 나머지, 즉 15가 리스트에 먼저 들어가게 된다. 그리고 나눠놓고 보니 몫이 1이네? 그럼 더 나눠봐야 뭐 나올게 없잖음. 그래서 jinsu_list에는 15, 1이 들어가게 된다.

while a >= 1:
    if a % N < 10:
        jinsu_list.append(a % N)
    else: 
        jinsu_list.append(chr(over_ten_list[over_ten_number.index(a % N)]))
    a = int(a / N)

그리고 여기서 필요한게 바로 이 부분이다. 위에서 31을 16진수로 바꾸기 위해 나눴을 때 리스트에 15, 1이 들어간다고 했는데 진수 변환할 때 10부터는 상응하는 알파벳을 사용한다. A부터 Z까지가 10~35인데, 위에서 설명했듯 1) N으로 나눈 나머지가 10보다 작으면 그냥 리스트에 넣고, 아니면 2) 숫자 목록에서 해당하는 숫자가 몇 번째인지 찾아서 3) 그 순서 그대로 아스키코드 리스트에서 찾은 다음 4) chr() 때려박아서 알파벳을 저장한다.

jinsu = jinsu_list[::-1]
jinsu = ''.join(map(str,jinsu))
print(jinsu)

한가지 더 짚고 넘어갈 부분이 있다. 31은 16진수로 1F가 맞는데(32가 20) 위에서 배열에 들어간 순서가 15(F), 1이니까 순서를 뒤집어줘야 한다. (진법 변환할때는 밑에서 위로 가는데 리스트에 넣는 순서는 위에서 밑으로 넣는다) 그리고 리스트니까 걍 뽑으면 [1, ‘F’]가 될 거 아녀? 그래서 다 떼버리고 안에 있는 요소를 .join으로 붙여주는거다. 문자열로 만들어서 붙여준 다음 출력하면 profit!

import sys

a, N = map(int, sys.stdin.readline().split())

over_ten_list = list(range(65,91))
over_ten_number = list(range(10,36))

jinsu_list = []

while a >= 1:
    if a % N < 10:
        jinsu_list.append(a % N)
    else: 
        jinsu_list.append(chr(over_ten_list[over_ten_number.index(a % N)]))
    a = int(a / N)

jinsu = jinsu_list[::-1]
jinsu = ''.join(map(str,jinsu))
print(jinsu)

그래서 이거 맞았음.