백준 11005 (진법 변환 2) - Python

김종언·2024년 1월 14일
0

백준

목록 보기
7/18

문제.

진법 변환 1 문제에서 조금만 바꾸면 되겠지? 했지만 진법 변환이라는 개념 자체에 익숙하지 않았던 탓에 꽤 골치아팠다.

https://dlxdlx.tistory.com/5 이 형님의 진법 개념에 대한 정리글을 읽고 아주 큰 도움이 됐다.

풀이.

N, B = map(int, input().split())
total = ""
text = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
degree = 0
sample = 0
while True:
    sample = N // (B ** degree)
    if sample == 0:
        break
    degree += 1

for i in reversed(range(degree)):
    total += text[N // (B ** i)]
    N = N % (B ** i)

print(total)

내가 푼 과정은 이렇다. 10진법 N이라는 숫자를 입력받은 후에 그 수 안에 B의 n제곱이 몇번 들어가는지, 즉 몫을 계수로 받고 나머지는 넘겨준 다음 다음 B의 n-1제곱으로 나누기. 이 과정을 반복해서 B진법수로 만들면 끝.

degree = 0
sample = 0
while True:
    sample = N // (B ** degree)
    if sample == 0:
        break
    degree += 1

먼저 N이 B의 몇 제곱까지의 몫을 내줄 수 있을지 정해야했다. while문을 True로 설정해 N // (B ** degree) 을 계속해서 sample에 담아주고 sample이 0이 되는 순간 즉, 더이상 나눌 수 없는 B의 제곱수까지 오면 반복문을 멈추고 제곱수를 확정한다. (이때 degree가 제곱수이며 입력값을 받았을 때 5가 된다.)

for i in reversed(range(degree)):
    total += text[N // (B ** i)]
    N = N % (B ** i)

print(total)

range(degree) 는 range(5)를 받게 되고 reverse시키면 (4, 3, 2, 1, 0)이라는 iterable을 받게된다. 내가 계산하고 싶은 차수들이다.

몫은 total에 넣어주고 나머지는 계속해서 갱신해준다. 이렇게 최종 total이 완성되면 print해준다.

코멘트.

다른 사람들이 쓴 코드를 보니 좀 많이 돌아갔다. 좀 생각을 이상하게 한 것 같다. 부끄럽지만 괜찮다. 이제 진짜 진법에 대한 이해가 더 깊어졌다. 당장 고수가 아니더라도 상관없다. 왜냐면 성과는 달팽이처럼 come.

profile
나는 김종언이다.

0개의 댓글