[문제 위치]
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;
}'문제 풀이 > 문제 풀이(BOJ)' 카테고리의 다른 글
| [Silver V] 출입 기록 - 27111 (0) | 2025.11.07 |
|---|---|
| [Silver V] 김인천씨의 식료품가게 (Small) - 12033 (0) | 2025.11.04 |
| [Silver V] 불사조 - 31780 (0) | 2025.11.01 |
| [Silver V] Photoshoot - 18323 (0) | 2025.11.01 |
| [Silver V] MP3 Songs - 7596 (0) | 2025.10.29 |