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 |