[백준/BOJ] 백준 2064번 : IP 주소

2021. 4. 9. 12:55알고리즘 문제풀이

www.acmicpc.net/problem/2064

 

2064번: IP 주소

네트워크에 연결되어 있는 컴퓨터들은 각각 하나의 IP 주소를 갖게 된다. 그리고 이러한 IP 주소를 갖는 컴퓨터들이 여러 개 모여서 하나의 IP 네트워크를 구성하게 된다. IP 네트워크는 ‘네트워

www.acmicpc.net

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