본문 바로가기
문제 해결/BOJ

[백준] 두 배 더하기

by 자잘 2023. 2. 6.

 

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