본문 바로가기
Algorithm/최적화

[백준] 1407번 2로 몇 번 나누어질까

by HANNI하니 2023. 9. 22.

사용 언어 - Python3

문제 -  1407번 2로 몇 번 나누어질까

 

1407번: 2로 몇 번 나누어질까

자연수 N이 주어지면, 자연수를 유지하면서 N을 2로 몇 번까지 나눌 수 있는지를 생각해 볼 수 있다. 즉, N의 모든 약수 중 2의 거듭제곱 꼴이면서 가장 큰 약수를 생각하는 것이다. 예를 들어 15의

www.acmicpc.net

 

정답

최적화 - 정수론(수학) (정답 맞춘 여부 X)

모든 숫자는 1로 나누어 떨어짐 -> F(A)는 기본 최소 A이다.

2의 거듭제곱으로 나눠주면서, 최소 몇개가 2의 거듭제곱으로 나눠지는지 확인한 후 그 값만큼 더해준다.

A부터 B 구간 = B-A+1 = B-(A-1) => A에 1을 빼주고 tmp_a와 tmp_b를 계산한 후, print(tmp_b - tmp_a)

A,B = map(int,input().split())
A -= 1 # 175 !
tmp_A = 0
tmp_A += A # 1로 나누었을 때의 값 더해주기 175//1 = 175
for i in range(1,99): # 2의 배수로 나누었을 때의 값 더해주기
    tmp_A += (A//(2**i))*((2**i)-(2**(i-1)))

tmp_B = 0
tmp_B += B
for i in range(1,99):
    tmp_B += (B//(2**i))*((2**i)-(2**(i-1)))
print(tmp_B-tmp_A)

tmp_A와 tmp_B를 만드는 과정은 똑같기 때문에, 함수로 만들어도 된다.

 

레퍼런스

  • 정답 깃허브

https://github.com/yyeongeun/codingtest/blob/main/BAEKJOON/1407_2%EB%A1%9C%EB%AA%87%EB%B2%88%EB%82%98%EB%88%84%EC%96%B4%EC%A7%88%EA%B9%8C.py

 

 

'Algorithm > 최적화' 카테고리의 다른 글

[백준] 14252번 공약수열  (1) 2023.10.23
[백준] 2436번 공약수  (0) 2023.10.23
[백준] 14232번 보석 도둑  (0) 2023.09.22
[백준] 11653번 소인수분해  (0) 2023.09.21
[백준] 1979번 소수 찾기  (0) 2023.09.21

댓글