문제
https://www.acmicpc.net/problem/11005
10진수를 N진수로 변환하기
풀이
https://koreanraichu.tistory.com/254
이거의 반대 버전이다. 변환하는 방법은 저기에 있으니 생략.
일단 로직 자체는 그렇게 어렵진 않다. 근데 코드를 보다보면 이게 뭔 개소린가 싶을 부분이 있으니 잘 따라오십셔.
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 |