정화 코딩

[C++] 개구리 (백준 25333번) 본문

PS

[C++] 개구리 (백준 25333번)

jungh150c 2024. 8. 3. 03:41

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

 

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

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

    int t;
    cin >> t;

    while (t--) {
        int a, b, x;
        cin >> a >> b >> x;

        vector<bool> chk(x + 1, false);
        queue<int> q;
        q.push(0);
        chk[0] = true;

        int cnt = 0;
        while (!q.empty()) {
            int cur = q.front();
            q.pop();
            int right = cur + a;
            if (right <= x && !chk[right]) {
                q.push(right);
                chk[right] = true;
                cnt++;
            }
            int left = cur - b;
            if (left > 0 && !chk[left]) {
                q.push(left);
                chk[left] = true;
                cnt++;
            }
        }

        cout << cnt << '\n';
    }
}

처음엔 이렇게 무지성 bfs 코드를 짰다. x가 2022까지는 잘 되는 듯 한데 x가 2000000000이 되니까 결과가 안 나온다. 아마 벡터 크기 제한 때문인 것 같다. 그리고 x 범위가 너무 크니까 이렇게 하면 안 된다는 생각이 들었고 상근타워 문제가 생각났다. 태그는 이분탐색이지만 나는 최소공배수를 활용하여 풀었다.
상근타워 문제의 내 풀이: https://jungh150c.tistory.com/132

 

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

int gcd(int x, int y) {
    if (y == 0) return x;
    return gcd (y, x % y);
}

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

    int t;
    cin >> t;

    while (t--) {
        int a, b, x;
        cin >> a >> b >> x;
        cout << x / gcd(a, b) << '\n';
    }
}

최대공약수를 이용한 풀이이다. 테스트 케이스 하나당 코드가 3줄밖에 없는 (gcd 함수 포함해도 5줄) 엄청 간단한 코드가 되었다. 상큰타워랑 약간 다르긴 하지만 아이디어는 비슷한 것 같다. 최소공배수/최대공약수를 이용하여 불필요한 연산을 확 줄이는 것. (AC)

 

'PS' 카테고리의 다른 글

[C++] 돌다리 (백준 12761번)  (0) 2024.08.05
[C++] 회문수 (백준 30446번)  (0) 2024.08.03
[C++] 2×n 타일링 2 (백준 11727번)  (0) 2024.08.03
[C++] 반복하지 않는 수 (백준 7696번)  (0) 2024.08.02
[C++] 치즈 (백준 2638번)  (0) 2024.07.22
Comments