본문 바로가기

컴퓨터/BOJ

[BOJ](Python) 6679번 : 싱기한 네자리 숫자 / n진법 변환 방법

www.acmicpc.net/problem/6679

 

6679번: 싱기한 네자리 숫자

싱기한 네자리 숫자란, [1000,9999]인 10진수 숫자중에서,  다음의 조건을 만족하는 숫자를 말한다. 숫자를 10진수, 12진수, 16진수로 나타낸 다음, 각각의 숫자에 대해, 각 숫자의 자리수를 더했을 �

www.acmicpc.net

소스 코드는 다음과 같다.

digit = ['0','1','2','3','4','5','6','7','8','9']
def convert(n, base):
    T = "0123456789ABCDEF"
    q, r = divmod(n, base) #divmod 몫과 나머지를 반환하는 함수
    if q == 0:
        return T[r]
    else:
        return convert(q, base) + T[r]

for i in range(1000,10000):
    c_10 = sum(list(map(int, str(i))))
    c_12_temp = convert(i, 12)
    c_16_temp = convert(i, 16)
    c_12 = 0; c_16 = 0
    for j in c_12_temp:
        if j in digit:
            c_12 += int(j)
        else:
            c_12 += ord(j) - 55
    for k in c_16_temp:
        if k in digit:
            c_16 += int(k)
        else:
            c_16 += ord(k) - 55
    if c_10 == c_12 == c_16:
        print(i)

i를 받았을 때, 이를 각각 10진법 12진법, 16진법으로 변환하고,

각 진법에서 자리수의 합을 비교하여 서로 같다면 i를 출력하도록 했다.

 


n진법을 변환하는 방법으로 두고두고 사용하자!

출처: codingdojang.com/scode/458

 

코딩도장

프로그래밍 문제풀이를 통해서 코딩 실력을 수련

codingdojang.com

원리 설명:

skeo131.tistory.com/55

 

[BOJ](Python) 1975번 : Number Game

https://www.acmicpc.net/problem/1975 1975번: Number Game 창영이는 심심해서 혼자 재미 없는 게임을 하나 생각해냈다. 숫자 N을 먼저 정하고, 이 숫자를 2진법, 3진법, 4진법, ..., 100만진법, 100만 1진법 등..

skeo131.tistory.com

이 문제와 푸는 방법이 매우 유사한데,

n을 k진법으로 변환하고자 할 때, n을 k로 나눴을 때 나머지는 n을 k진법으로 변환하였을 때 그 끝자리와 같고, 그 앞의 자리는 n//k를 k진법으로 변환하였을 때 그 나머지이다.

 

예를 들어, 13을 3진법으로 변환한다면 다음과 같다.

13은 3으로 나누었을 때 몫이 4이고, 나머지가 1이다. 따라서 13을 3진법으로 바꾸었을 때 맨 끝자리는 1이다.

그 다음, 4를 3진법으로 나누었을 때 몫이 1이고 나머지가 1이다. 따라서 4를 3진법으로 나누었을 때 맨 끝자리는 1이다.

그 다음, 1을 3진법으로 나누었을 때 몫이 0이고 나머지가 1이다. 몫이 0이므로 백트래킹을 종료하고 나머지를 반환한다.

 

13을 3진법으로 변환하였을 때 결과