[백준/BOJ] 백준 2064번 : IP 주소
2021. 4. 9. 12:55ㆍ알고리즘 문제풀이
ip 주소들에서 비트가 달라지는 점을 파악해서 ip 비트가 달라지는 지점의 앞 부분은 모두 1로 채우고 나머지는 0으로 채워서 네트워크 마스크를 만든다 그리고, 아무 ip주소(해당 풀이에서는 0번째 ip로 했다)와 네트워크 마스크를 &연산을 해서 네트워크 주소를 구했다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
int n;
vector<int> ip;
int main()
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);
cin >> n;
for (int i = 0; i < n; i++)
{
string input;
cin >> input;
int index1 = input.find(".", 0);
int index2 = input.find(".", index1 + 1);
int index3 = input.find(".", index2 + 1);
string num1 = input.substr(0, index1);
string num2 = input.substr(index1 + 1, index2 - (index1 + 1));
string num3 = input.substr(index2 + 1, index3 - (index2 + 1));
string num4 = input.substr(index3 + 1, input.size() - (index3 + 1));
int this_num = (stoi(num1) << 24) + (stoi(num2) << 16) + (stoi(num3) << 8) + stoi(num4);
ip.push_back(this_num);
}
int diff_point = -1; //ip 비트가 달라지는 지점
for (int i = 31; i >= 0; i--)
{
for (int j = 1; j < n; j++)
{
int left = ip[j - 1];
int right = ip[j];
//ip 비트가 달라지는 지점을 찾았을때
if ((left & (1 << i)) != (right & (1 << i)))
{
diff_point = i;
break;
}
}
if (diff_point != -1)
break;
}
int net_work_ip = 0;
int net_work_mask = 0;
//모든 ip가 같을때
if (diff_point == -1)
{
net_work_mask = (1 << 32) - 1;
net_work_ip = net_work_mask & ip[0];
}
else
{
//ip 비트가 달라지는 지점의 앞 부분은 모두 1로 채우고 나머지는 0으로 채워서 네트워크 마스크를 만든다
for (int i = 31; i > diff_point; i--)
{
net_work_mask |= (1 << i);
}
net_work_ip = net_work_mask & ip[0];
}
string result1 = "";
string result2 = "";
for (int i = 0; i < 4; i++)
{
int check = (1 << 8) - 1;
int result1_number = (net_work_ip & check);
int result2_number = (net_work_mask & check);
result1 = to_string(result1_number) + "." + result1;
result2 = to_string(result2_number) + "." + result2;
net_work_ip = (net_work_ip >> 8);
net_work_mask = (net_work_mask >> 8);
}
result1.pop_back();
result2.pop_back();
cout << result1 << "\n";
cout << result2;
return 0;
}
'알고리즘 문제풀이' 카테고리의 다른 글
[백준/BOJ] 백준 2957번 : 이진 탐색 트리 (0) | 2021.04.09 |
---|---|
[백준/BOJ] 백준 1113번 : 수영장 만들기 (0) | 2021.04.09 |
[백준/BOJ] 백준 2473번 : 세 용액 (0) | 2021.04.09 |
[백준/BOJ] 백준 1202번 : 보석 도둑 (0) | 2021.03.25 |
[백준/BOJ] 백준 1946번 : 신입 사원 (0) | 2021.03.25 |