PS

BOJ 27440 : 1로 만들기 3

lickelon 2024. 4. 14. 23:43
  • 문제 링크 : boj.kr/27440
  • 난이도 : G4
  • 태그 : BFS, 맵
 

27440번: 1로 만들기 3

첫째 줄에 1보다 크거나 같고, 1018보다 작거나 같은 정수 N이 주어진다.

www.acmicpc.net


코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    ll n;
    cin >> n;
    unordered_map<ll, ll> _um;
    _um[n] = 0;
    queue<ll> _q;
    _q.push(n);
    while(!_q.empty()) {
        ll temp = _q.front(); _q.pop();
        if(temp == 1) break;
        if(temp % 3 == 0 && !_um[temp/3]) {
            _um[temp/3] = _um[temp]+1;
            _q.push(temp/3);
        }
        if(temp % 2 == 0 && !_um[temp/2]) {
            _um[temp/2] = _um[temp]+1;
            _q.push(temp/2);
        }
        if(!_um[temp-1]) {
            _um[temp-1] = _um[temp]+1;
            _q.push(temp-1);
        }
    }
    cout << _um[1];

    return 0;
}

풀이

DP로 풀기에는 범위가 너무 크니 BFS로 풀어봤더니 풀렸다. 왜 시간안에 동작하는지 증명하는 방법을 모르겠다.

'PS' 카테고리의 다른 글

BOJ 2258 : 정육점  (0) 2024.04.16
BOJ 27740 : 시프트 연산  (0) 2024.04.15
BOJ 22981 : 휴먼 파이프라인  (0) 2024.04.13
BOJ 18234 : 당근 훔쳐 먹기  (0) 2024.04.12
BOJ 25577 : 열 정렬정렬 정  (0) 2024.04.11