※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 21275번 문제인 폰 호석만이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/probelm/21275

 

주어진 두 수를 2진수부터 36진수까지 각각의 진법으로 해석한 값을 먼저 계산해두자. 그리고 각각의 진법 쌍에 대하여 두 값이 같은지를 확인해 문제를 해결하자.

 

조건에 따라 두 진법이 서로 같으면 안 되며 각각의 값이 263 미만이어야 한다는 점에 유의하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;
typedef long long ll;
typedef __int128 lll;

lll MX = 9223372036854775807LL;
lll A[37], B[37];
string s;
ll aval, aidx, bidx, cnt;

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

    cin >> s;
    for (int b = 2; b < 37; b++) {
        for (auto &l:s) {
            int x;
            if ('0' <= l && l <= '9') x = l - '0';
            else x = 10 + l - 'a';
            if (x >= b) {
                A[b] = -1;
                break;
            }
            A[b] = A[b] * b + x;
            if (A[b] > MX) {
                A[b] = -1;
                break;
            }
        }
    }
    cin >> s;
    for (int b = 2; b < 37; b++) {
        for (auto &l:s) {
            int x;
            if ('0' <= l && l <= '9') x = l - '0';
            else x = 10 + l - 'a';
            if (x >= b) {
                B[b] = -1;
                break;
            }
            B[b] = B[b] * b + x;
            if (B[b] > MX) {
                B[b] = -1;
                break;
            }
        }
    }

    for (int i = 2; i < 37; i++) {
        for (int j = 2; j < 37; j++) {
            if (i != j && A[i] == B[j] && A[i] >= 0) aval = A[i], aidx = i, bidx = j, cnt++;
        }
    }

    if (cnt > 1) cout << "Multiple";
    else if (cnt == 1) cout << aval << ' ' << aidx << ' ' << bidx;
    else cout << "Impossible";
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 33689 // C++] CPDU  (0) 2025.04.01
[BOJ 33690 // C++] 포린드롬  (0) 2025.03.31
[BOJ 33574 // C++] 끊임없는 정렬과 창조함으로  (0) 2025.03.27
[BOJ 29703 // C++] 펭귄의 하루  (0) 2025.03.26
[BOJ 33656 // C++] Island Exploration  (0) 2025.03.25

+ Recent posts