문제출처 : https://www.acmicpc.net/problem/12931
code
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int N, cnt = 0;
bool isfinish = true , isdivide;
cin >> N;
vector<int>arr(N);
for (int i = 0; i < N; i++)
cin >> arr[i];
while (isfinish)
{
isfinish = false;
isdivide = false;
for (int i = 0; i < N; i++)
{
if (arr[i] % 2 == 1 && arr[i] > 0)
{
arr[i]--;
cnt++;
}
if (arr[i] != 0)
isdivide = true;
}
if (isdivide)
{
for (int i = 0; i < N; i++)
arr[i] /= 2;
cnt++;
}
for (int i = 0; i < N; i++)
if (arr[i]) isfinish = true;
}
cout << cnt;
return 0;
}
조건을 그대로 따라려고하지말고 조건을 거꾸로 거슬러 올라간다고 생각하면 굉장히 쉽게 풀리는 문제이다.