https://www.acmicpc.net/problem/12931
12931번: 두 배 더하기
모든 값이 0으로 채워져 있는 길이가 N인 배열 A가 있다. 영선이는 다음과 같은 두 연산을 수행할 수 있다. 배열에 있는 값 하나를 1 증가시킨다. 배열에 있는 모든 값을 두 배 시킨다. 배열 B가 주
www.acmicpc.net
배열의 모든 요소들을 0으로 만드는 최소횟수를 구하는 방식으로 바꿔서 생각해보면 편하다. 최소횟수가 되기 위해서는 나누기 연산을 최대한 활용해야하는데 그렇게 하기 위해서 nums의 모든 요소들을 짝수로 만들어주고 나누기를 진행해주면 된다.
# 문제링크: https://www.acmicpc.net/problem/12931
import sys
input = sys.stdin.readline
n = int(input())
nums = list(map(int, input().split()))
def isFinish():
for num in nums:
if num != 0:
return False
return True
ans = 0
# while문을 한번 돌때 마다 nums에 들어있는 숫자들을 짝수로 맞춰주고 나누기를 진행하면 된다.ㄴ
while True:
for i in range(n):
if nums[i] == 0:
continue
# 홀수이면 1을 빼준다.
if nums[i] % 2 == 1:
ans += 1
nums[i] -= 1
nums[i] //= 2
if isFinish():
break
ans += 1
print(ans)
'문제 해결 > BOJ' 카테고리의 다른 글
[백준] 벽 부수고 이동하기 (0) | 2023.02.07 |
---|---|
[백준] 원판 돌리기 (0) | 2023.02.07 |
[백준] 숨바꼭질 4 (0) | 2023.02.06 |
[백준] 군사 이동 (0) | 2023.02.05 |
[백준] 트리의 지름 (0) | 2023.02.04 |