본문 바로가기

Algorithm

백준 12931번 두 배 더하기

반응형

문제

모든 값이 0으로 채워져 있는 길이가 N인 배열 A가 있다. 영선이는 다음과 같은 두 연산을 수행할 수 있다.

  • 배열에 있는 값 하나를 1 증가시킨다.
  • 배열에 있는 모든 값을 두 배 시킨다.

배열 B가 주어졌을 때, 배열 A를 B로 만들기 위한 연산의 최소 횟수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 배열의 크기 N이 주어진다. (1 ≤ N ≤ 50)

둘째 줄에는 배열 B에 들어있는 원소가 공백으로 구분해서 주어진다. 배열에 B에 들어있는 값은 0보다 크거나 같고, 1,000보다 작거나 같다.

출력

첫째 줄에 배열 A를 B로 바꾸기 위한 최소 연산 횟수를 출력한다.

 

처음 벡터에서 목표 벡터로 만들어 가는 것이 아니라

목표 벡터에서 처음 벡터로 줄여가는 것으로 생각하면 간단

어쨋든 *2 와 +1 의 연산으로 목표 벡터가 만들어졌을 것이고

*2가 수행되었다면 목표벡터를 /2했을때 다 나뉘어져야 하므로 안 나뉘어 진다면 해당 인덱스 -1을 수행.

 

#include<iostream>
#include<string.h>
#include<vector>
#include<stack>
#include<algorithm>
#include<queue>

using namespace std;

int res[50];
struct Node
{
	int *arr;
	int c;
};

int main(void)
{
	int N;
	cin >> N;
	for (int i = 0; i < N; i++)
	{
		cin >> res[i];
	}
	
	int count = 0;
	while (1)
	{
		bool flag = false;
		for (int i = 0; i < N; i++)
		{
			if (res[i])
			{
				flag = true;
				break;
			}
		}
		if (!flag)
		{
			break;
		}


		bool check = false;
		for (int i = 0; i < N; i++)
		{
			if (res[i] % 2)
			{
				check = true;
				res[i]--;
				break;
			}
		}
		if (!check)
		{
			for (int i = 0; i < N; i++)
			{
				res[i] /= 2;
			}
		}

		count++;
	}
	cout << count << endl;
	

	return 0;//정상종료시 반드시 0을 리턴해야합니다.
}
반응형

'Algorithm' 카테고리의 다른 글

백준 11049번 행렬 곱셈 순서  (0) 2020.08.14
백준 15468번 퇴사 2 ()  (0) 2020.08.14
백준 9328번 열쇠  (0) 2020.08.12
백준 1495번 기타리스트  (0) 2020.08.12
백준 11404번 플로이드  (0) 2020.08.11