본문 바로가기
코딩테스트/백준

백준 > 단계별로 풀어보기 > 일반 수학 1 > 11005번: 진법 변환2

by 나는야석사 2024. 7. 19.

문제

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(리스트)