https://www.acmicpc.net/problem/1740
1740번: 거듭제곱
3의 제곱수를 생각하자. 3의 0제곱, 3의 1제곱, 3의 2제곱, ... 은 순서대로 1, 3, 9, 27, ... 이 된다. 이를 바탕으로, 한 개 이상의 서로 다른 3의 제곱수의 합으로 표현되는 수를 생각할 수 있다. 예를
www.acmicpc.net
n = int(input())
bin_num = bin(n)
bin_num = bin_num[2:] # 이진수로 변환했기 때문에 0b 제거
ans = 0
for i in range(len(bin_num)):
if bin_num[i] == "1": # 1이 있으면
temp = 3 ** (len(bin_num)-i-1) # 이진수로 따지면 3의 제곱자리임
ans += temp # 답에 더해주기
print(ans)
- 접근방식: 이진수로 변환하여 2의 0승 자리에 3의 0승, 2의 1승자리에 3의 1승으로 계산. 그러면 3의 제곱수의 합으로 표현되는 숫자 출력 가능
- 느낀점: N은 500,000,000,000 이하의 자연수이므로 하나씩 찾는 방법은 안될 거 같고 이진법으로 응용하여 변환해서 풀면 쉽게 해결 가능.
'자료구조, 알고리즘 > 비트마스킹' 카테고리의 다른 글
[백준] 1052 물병(비트마스킹) - Python (0) | 2023.04.22 |
---|---|
[백준] 1094 막대기(비트마스킹) - Python (0) | 2023.04.17 |
[백준] 11723 집합(비트마스킹) - Python (1) | 2023.04.16 |