본문 바로가기

Algorithm

백준 16936번 나3곱2

반응형

문제

나3곱2 게임은 정수 하나를 이용한다. 가장 먼저, 정수 x로 시작하고, 연산을 N-1번 적용한다. 적용할 수 있는 연산은 두 가지 있고, 아래와 같다.

  • 나3: x를 3으로 나눈다. x는 3으로 나누어 떨어져야 한다.
  • 곱2: x에 2를 곱한다.

나3곱2 게임을 진행하면서, 만든 수를 모두 기록하면 수열 A를 만들 수 있다. 예를 들어, x = 9, N = 6이고, 적용한 연산이 곱2, 곱2, 나3, 곱2, 나3인 경우에 A = [9, 18, 36, 12, 24, 8] 이다.

수열 A의 순서를 섞은 수열 B가 주어졌을 때, 수열 A를 구해보자.

입력

첫째 줄에 수열의 크기 N(2 ≤ N ≤ 100)이 주어진다. 둘째 줄에는 수열 B가 주어진다. B에 포함된 원소는 1018 보다 작거나 같은 자연수이다.

출력

나3곱2 게임의 결과 수열 A를 출력한다. 항상 정답이 존재하는 경우에만 입력으로 주어지며, 가능한 정답이 여러가지인 경우에는 아무거나 출력한다.

 

벡터를 하나 둬서 가능한 경우 만들기 반복. 브루트포스

 

#include<iostream>
#include<string>
#include<vector>
#include<queue>
using namespace std;

int N;
long long arr[100];

bool check(long long num)
{
	for (int i = 0; i < N; i++)
	{
		if (arr[i] == num)
		{
			return true;
		}
	}
	return false;
}


int main(void)
{
	cin >> N;
	for (int i = 0; i < N; i++)
	{
		cin >> arr[i]; 
	}

	for (int i = 0; i < N; i++)
	{
		vector<long long> vec;
		vec.push_back(arr[i]);
		bool flag = false;
		while (1)
		{
			if (vec.size() == N)
			{
				flag = true;
				break;
			}
			bool flag2 = false;
			if (check(vec[vec.size() - 1]*2))
			{
				flag2 = true;
				vec.push_back(vec[vec.size() - 1] * 2);
			}
			if (!(vec[vec.size() - 1] % 3))
			{
				if (check(vec[vec.size() - 1] / 3))
				{
					flag2 = true;
					vec.push_back(vec[vec.size() - 1] / 3);
				}
			}
			if (!flag2)
			{
				break;
			}
		}
		if (flag)
		{
			for (int j = 0; j < vec.size(); j++)
			{
				cout << vec[j] << " ";
			}
			return 0;
		}
	}
}
반응형

'Algorithm' 카테고리의 다른 글

백준 16938번 캠프 준비  (0) 2020.07.23
백준 1175번 배달  (0) 2020.07.23
백준 16968번 차량 번호판 1  (0) 2020.07.22
백준 16973번 직사각형 탈출  (0) 2020.07.22
백준 3019번 테트리스  (0) 2020.07.21