본문 바로가기

문제 풀이/문제 풀이(BOJ)

[Silver V] 지금 밥이 문제냐 - 12787

[문제 위치]

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

[문제 풀이]

이 문제는 구현(진법/비트 조작) 를 통해 해결하는 문제이다.
IPv8 주소는 8개의 0~255 정수(옥텟)를 점으로 구분한 형태이며, 이를 왼쪽부터 순서대로 8바이트 부호 없는 정수에 이어 붙인 값과 일대일로 대응하므로 문자열이 주어지면 각 옥텟을 파싱해 ans = (ans<<8) | 옥텟 으로 누적하고, 정수가 주어지면 상위 바이트부터 (x>>(8*i))&255 를 이용해 8개의 옥텟으로 복원하여 점으로 이어서 출력하게 해결한다
아래는 이를 구현한 코드이다.

#include <bits/stdc++.h>
using namespace std;

#define FASTIO ios::sync_with_stdio(false); cin.tie(nullptr);

int main() {
    FASTIO;
    int T;
    if (!(cin >> T)) return 0;

    while (T--) {
        int M; 
        cin >> M;
        if (M == 1) {
            string s; 
            cin >> s; // 형식: a.b.c.d.e.f.g.h (각각 0..255)
            unsigned long long ans = 0;
            int cur = 0, parts = 0;
            for (char c : s) {
                if (c == '.') {
                    ans = (ans << 8) | (unsigned long long)cur;
                    cur = 0;
                    ++parts;
                } else {
                    cur = cur * 10 + (c - '0');
                }
            }
            ans = (ans << 8) | (unsigned long long)cur; // 마지막 파트
            ++parts;

            // (문제 조건상 항상 유효 입력이 주어진다)
            cout << ans << '\n';
        } else {
            unsigned long long x; 
            cin >> x;
            for (int i = 7; i >= 0; --i) {
                unsigned long long byte = (x >> (8 * i)) & 255ULL;
                cout << byte;
                if (i) cout << '.';
            }
            cout << '\n';
        }
    }
    return 0;
}