PS

BOJ 2064 : IP 주소

lickelon 2024. 5. 4. 23:36
  • 문제 링크 : boj.kr/2064
  • 난이도 : G3
  • 태그 : 구현, 비트마스킹

코드

#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>;

unsigned int ip_to_uint(string ip) {
    int res = 0;
    int temp = 0;
    for(auto u : ip) {
        if('0' <= u && u <= '9') {
            temp *= 10;
            temp += u - '0';
        }
        else {
            res *= 256;
            res += temp;
            temp = 0;
        }
    }
    return res * 256 + temp;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int n;
    cin >> n;
    unsigned int mask, pivot;
    mask = 0xFFFFFFFF;
    string s;
    cin >> s;
    pivot = ip_to_uint(s);
    for(int i = 1; i < n; i++) {
        cin >> s;
        mask &= ~(pivot ^ ip_to_uint(s));
    }
    bitset<32> bs(mask);
    bool flag = true;
    for(int i = 31; i >= 0; i--) {
        flag &= bs[i];
        bs[i] = flag;
    }
    mask = bs.to_ulong();
    pivot &= mask;
    cout << (pivot / (1 << 24) % (1 << 8)) << "." 
        << (pivot / (1 << 16) % (1 << 8)) << "." 
        << (pivot / (1 << 8) % (1 << 8)) << "." 
        << (pivot / (1 << 0) % (1 << 8)) << "\n";
    cout << (mask / (1 << 24) % (1 << 8)) << "." 
        << (mask / (1 << 16) % (1 << 8)) << "." 
        << (mask / (1 << 8) % (1 << 8)) << "." 
        << (mask / (1 << 0) % (1 << 8)) << "\n";
    return 0;
}

풀이

모든 아이피에서 같은 앞 부분이 네트워크 마스크이므로 비트연산을 통해 네트워크 마스크를 구해준다.

아무 아이피에 네트워크 마스크를 AND 연산하면 네트워크 주소가 나오게 된다.

비트 연산을 연습하기 좋은 문제이다.

'PS' 카테고리의 다른 글

BOJ 13424 : 비밀 모임  (0) 2024.05.06
BOJ 17436 : 소수의 배수  (0) 2024.05.05
BOJ 6593 : 상범 빌딩  (0) 2024.05.03
BOJ 2170 : 선 긋기  (0) 2024.05.02
BOJ 1916 : 최소비용 구하기  (1) 2024.05.01