barcode

백준 11005번 풀이

BOJ/[BOJ] Python

문제

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

 

11005번: 진법 변환 2

10진법 수 N이 주어진다. 이 수를 B진법으로 바꿔 출력하는 프로그램을 작성하시오. 10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를

www.acmicpc.net

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

 

풀이

https://koreanraichu.tistory.com/254

 

백준 2745번 풀이

문제 https://www.acmicpc.net/problem/2745 2745번: 진법 변환 B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오. 10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있

koreanraichu.tistory.com

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

 

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

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)

그래서 이거 맞았음.

'BOJ > [BOJ] Python' 카테고리의 다른 글

백준 2903번 풀이  (0) 2023.06.21
백준 2720번 풀이  (0) 2023.06.19
백준 2745번 풀이  (0) 2023.06.16
백준 25206번 풀이  (0) 2023.06.15
백준 2444번 풀이  (0) 2023.06.02