- 문제 링크 : 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 연산하면 네트워크 주소가 나오게 된다.
비트 연산을 연습하기 좋은 문제이다.
728x90
'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 |