문제
10진법 수 N이 주어진다. 이 수를 B진법으로 바꿔 출력하는 프로그램을 작성하시오.
10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.
A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35
입력
첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36) N은 10억보다 작거나 같은 자연수이다.
출력
첫째 줄에 10진법 수 N을 B진법으로 출력한다.
예제 입력 1 복사
60466175 36
예제 출력 1 복사
ZZZZZ
어려웠다..... 주석으로 내용을 대신 하겠다...
N, B = map(int, input().split()) # N은 수, B는 진법
digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" # 10진법 이상의 수를 쓰기 위한 것. 16진법에서는 10이 A임
result = [] # 반복문을 실행하며 B진법의 수를 저장할 문자열, 리스트는 [::-1]이 안됨
while N > 0: # N이 0보다 작으면 나머지가 안나옴
reminder = N % B # 현재 자리수의 N진법에 해당하는 수
N //= B # 다음 자리수의 N진법에 해당하는 수를 구하기 위한 몫
result.append(digits[reminder]) # 나머지는 B(나누는 수)보다 항상 작음.
# 나머지와 digits은 일대일 대응으로 나머지가 10이면 digits의 A에 해당함
print(''.join(result[::-1]))
10진법 수 N을 B 진법의 수로 변경하려면, 10진법 수 N을 B로 나눈 나머지를 찾아야 한다.
그리고 나눠진 몫을 또 B으로 나눠서 나머지가 0이 나올 때까지 해야한다.
여기서는 36진법이기 때문에 나머지가 35까지다. 나머지가 나누는 수보다 클 순 없으니까!
또한 16진법에선 A가 10, Z가 35로 10 이상의 수를 사용하기 위해서는 알파벳을 사용해야 한다(배운거 다 까먹음)
그래서 digits 변수를 정의해주고, 반복문을 실행하며 B진법의 수를 저장할 리스트를 초기화해준다.
나머지가 B보단 작고, 나머지가 0이 나올 때까지 반복해야하니까 while N > 0:
10진법 수 N을 B로 나눈 나머지에 대응하는 수 == 현재 자리수에서의 B진법 수
N은 계속 나눠줘야 하니 B로 나눈 값을 다시 N으로 변경해준다.
result 리스트에 일대일대응하는 digits에서 (10진법 수 N을 B로 나눈 나머지에 해당하는 값==digits에서의 인덱스)값을 하나 추가해준다.
리스트를 문자열로 변환하는 방법
''.join(리스트) or "".join(리스트)
'코딩테스트 > 백준' 카테고리의 다른 글
백준 > 단계별로 풀어보기 > 일반 수학 1 > 2903번: 중앙 이동 알고리즘 (0) | 2024.07.22 |
---|---|
백준 > 단계별로 풀어보기 > 일반 수학 1 > 2720번: 세탁소 사장 동혁 (0) | 2024.07.19 |
백준 > 단계별로 풀어보기 > 일반 수학 1 > 2745번: 진법 변환 (0) | 2024.07.19 |
백준 > 단계별로 풀어보기 > 2차원 배열 > 2563번: 색종이 (1) | 2024.07.18 |
백준 > 단계별로 풀어보기 > 2차원 배열 > 10798번: 세로읽기 (0) | 2024.07.18 |