소스 코드는 다음과 같다.
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
원리 설명:
이 문제와 푸는 방법이 매우 유사한데,
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이므로 백트래킹을 종료하고 나머지를 반환한다.
'컴퓨터 > BOJ' 카테고리의 다른 글
[BOJ](Python) 8320번 : 직사각형을 만드는 방법 (0) | 2020.08.30 |
---|---|
[BOJ](Python) 1010번 : 다리 놓기 (0) | 2020.08.30 |
[BOJ](Python) 4690번 : 완전 세제곱 (0) | 2020.08.29 |
[BOJ](Python) 3049번 : 다각형의 대각선 (0) | 2020.08.29 |
[BOJ](Python) 2998번 : 8진수 / deque 주의할 점 (0) | 2020.08.29 |