※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 16936번 문제인 나3곱2이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/16936
16936번: 나3곱2
나3곱2 게임은 정수 하나를 이용한다. 가장 먼저, 정수 x로 시작하고, 연산을 N-1번 적용한다. 적용할 수 있는 연산은 두 가지 있고, 아래와 같다. 나3: x를 3으로 나눈다. x는 3으로 나누어 떨어져야
www.acmicpc.net
연산 과정을 통해 곱할 수 있는 수는 2 뿐이고, 3만을 나누므로 주어진 숫자들 중 소인수 3을 가장 많이 가진 수들이 수열의 앞쪽에 나오게 될 것이라는 것을 알 수 있다.
또한 소인수 3의 개수가 같다면 남은 연산은 2를 곱하는 것 뿐이므로 작은 숫자가 먼저 나올 수밖에 없다.
따라서 주어진 수들을 (1) 소인수 3의 개수 내림차순으로, 그 개수가 같다면 (2) 크기순 오름차순으로 정렬하는 것으로 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
struct num {
ll x, cnt;
num() {
this->x = 0, this->cnt = 0;
}
num(ll x, ll cnt) {
this->x = x, this->cnt = cnt;
}
};
bool comp(num n1, num n2) {
if (n1.cnt != n2.cnt) return n1.cnt > n2.cnt;
return n1.x < n2.x;
}
num arr[100];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N; cin >> N;
for (int i = 0; i < N; i++) {
ll x; cin >> x;
ll xx = x, cnt = 0;
while (xx % 3 == 0) {
xx /= 3;
cnt++;
}
arr[i] = num(x, cnt);
}
sort(arr, arr + N, comp);
for (int i = 0; i < N; i++) cout << arr[i].x << ' ';
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 15897 // C++] 잘못 구현한 에라토스테네스의 체 (0) | 2021.11.16 |
---|---|
[BOJ 15907 // C++] Acka의 리듬 세상 (0) | 2021.11.15 |
[BOJ 2023 // C++] 신기한 소수 (0) | 2021.11.13 |
[BOJ 1188 // C++] 음식 평론가 (0) | 2021.11.12 |
[BOJ 10158 // C++] 개미 (0) | 2021.11.11 |