본문 바로가기

백준

백준16936 - 나3곱2

https://www.acmicpc.net/problem/16936

 

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,

www.acmicpc.net

2와 3을 인수로 몇 개나 갖는지 조사한 후 기준에 맞게 정렬한다. 정렬 기준 첫번째는 3을 인수로 많이 가지는 순이고 두번째 기준은 2를 인수로 적게 가지는 순이다.

 

ex.) 8 72 16 36 24 32

***2와 3을 인수로 몇개 가지는지 표현***

8 : 2^3

72 : 2^3 * 3^2

16 : 2^4

36 : 2^2 * 3^2

24 : 2^3 * 3^1

32 : 2^5

 

***정렬한 결과

36 : 2^2 * 3^2

72 : 2^3 * 3^2

24 : 2^3 * 3^1

8 : 2^3

16 : 2^4

32 : 2^5

 

***수열***

36 72 24 8 16 32

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//1번째 비교 대상은 인수로 3이 많은 수, 2번째 비교 대상은 인수로 2가 적은 수
bool compare(pair<long long int, pair<int,long long int>> a, pair<int, pair<int,long long int>> b) {
	if (a.first == b.first) { //인자로 3의 수가 같은 경우
		return a.second.first < b.second.first; //인자로 2의 수를 비교
	}
	return a.first > b.first;
}

int main() {
	int n;
	vector < pair<long long int, pair<long long int, long long int>>> v; //첫번째는 3의 인자수, 두번째는 2의 인자수, 세번째는 수열의 원소

	cin >> n;
	for (int i = 0; i < n; i++) {
		long long int num; //수열의 원소
		long long int check2; //2를 인수로 가지는 경우 총 몇 개의 2가 들어갔는지 확인하기 위해 임시로 담아놓는 변수
		long long int check3; //3을 인수로 가지는 경우 총 몇 개의 3이 들어갔는지 확인하기 위해 임시로 담아놓는 변수
		long long int cnt2 = 0; //2를 인자로 몇 개나 가지는지
		long long int cnt3 = 0; //3을 인자로 몇 개나 가지는지

		cin >> num;
		
		//2와 3을 인수로 몇 개나 가지는 원소를 임시로 담아놓는다.
		check2 = num;
		check3 = num;

		//2를 인수로 몇 개나 갖는지 찾는다.
		while (1) {
			if (check2 % 2 != 0) {
				break;
			}
			check2 = check2 / 2;
			cnt2++;
		}
		
		//3을 인수로 몇 개나 갖는지 찾는다.
		while (1) {
			if (check3 % 3 != 0) {
				break;
			}
			check3 = check3 / 3;
			cnt3++;
		}

		v.push_back(pair<long long int, pair<long long int, long long int>>(cnt3, pair<long long int, long long int>(cnt2, num))); //3의 인수 갯수, 2의 인수 갯수, 수열의 원소를 넣는다.
	}

	sort(v.begin(), v.end(), compare); //sort로 정렬, 기준은 compare함수

	//벡터의 각 원소 세 번째 요소가 수열의 원소
	for (int i = 0; i < v.size(); i++) {
		cout << v[i].second.second << ' ';
	}
}

'백준' 카테고리의 다른 글

백준1527 - 금민수의 개수  (0) 2019.08.17
백준2477 - 참외밭  (0) 2019.08.14
백준1339 - 단어 수학  (0) 2019.08.13
백준1436 - 영화감독 숌  (0) 2019.08.12
백준17175 - 피보나치는 지겨웡~  (0) 2019.08.12