Problem Solving/BOJ

[백준 16936번] [Bruteforce] 나3곱2

  • -
728x90
반응형

잘 생각해보면 3과 2는 서로소이므로, 배타적으로만 존재가능하다.

 

예를 들어 v[i]라는 숫자가 존재한다고 했을 때, v[i] / 3이 존재하거나 v[i] * 2만 존재해야 한다.

왜냐하면, 3과 2는 서로소이기 때문에 3으로 나눈 것을 아무리 2를 곱해도 절대로 3으로 나눈 것을 커버할 수 없다.

 

추가적으로 수열의 크기가 N이기 때문에, v[0]으로 나올 수 있는 후보를 하나씩 체크해서 가능한 경우를 모두 확인해주면 된다.

이때, 주어진 수에 v[i] / 3이나 v[i] * 2가 존재하는지를 쉽게 파악하기 위해서 set 자료구조를 활용하였다.

시간 복잡도는 $O(n^2logn)$이므로 시간 안에 충분히 통과한다.

#include <bits/stdc++.h> #define fastio cin.tie(0)->sync_with_stdio(0) using namespace std; typedef long long ll; typedef pair<int, int> pii; int move_x[4] = {-1, 1, 0, 0}; int move_y[4] = {0, 0, -1, 1}; int main() { fastio; int n; cin >> n; vector<ll> v(n); for(int i = 0; i < n; i++){ cin >> v[i]; } for(int i = 0; i < n; i++){ vector<ll> result = {v[i]}; set<ll> s(v.begin(), v.end()); for(ll cur = v[i]; result.size() < n; result.push_back(cur)){ s.erase(cur); if(s.count(cur * 2)) cur *= 2; else if(cur % 3 == 0 && s.count(cur / 3)) cur /= 3; else break; // Not found } if(result.size() == n){ for(auto &p : result){ cout << p << " "; } cout << "\n"; return 0; } } }
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.