어흥

[백준 2064] IP 주소 (C++) 본문

알고리즘/백준

[백준 2064] IP 주소 (C++)

라이언납시오 2021. 12. 29. 22:21
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/2064

 

2064번: IP 주소

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

www.acmicpc.net

1. 주의할 점

- 비트마스킹을 이용해도 되지만, 네트워크 주소의 결과가 0.255.255.0이 나왔을때 전부 0으로 바꿔야하는 작업이 필요

 

2. 구현

- 입력 받는 문자열을 int2string() 함수를 이용하여 전부 2진수로 바꾼다

- 해당 반환값을 Ip[] 배열에 String 형태로 저장한다

- 모든 문자열을 처음부터 비교하여 왼쪽에서부터 Idx-1까지 같다고 할때, Idx를 구한다

- Ans[][] 배열을 통해 [0][]에는 네트워크 주소를, [1][]에는 서브넷 마스크를 저장한다

#include <iostream>
#include <string>
#include <sstream>
#include <bitset>
using namespace std;
int num;
string ip[1000];
int ans[2][4];

string int2string(int val) {
	string s = "";
	for (int i = 0; i < 8; i++) {
		int p = val % 2;
		if (p == 0) s = "0" + s;
		else s = "1" + s;
		val /= 2;
	}
	return s;
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	cin >> num;
	string str,s1;
	for (int i = 0; i < num; i++) {
		cin >> str;
		istringstream ss(str);
		int idx = 0;
		while (getline(ss, s1, '.')) {
			ip[i] += int2string(stoi(s1));
		}
	}
	int idx = 32;
	for (int i = 0; i < 32; i++) {
		for (int j = 1; j < num; j++) {
			if (ip[0][i] != ip[j][i]) {
				idx = i;
				break;
			}
		}
		if (idx < 32) break;
	}
	int fir = 0, sec = 0;
	for (int i = 0; i < 32; i++) {
		if (i % 8 == 0 && i != 0) {
			ans[0][(i / 8) - 1] = fir;
			ans[1][(i / 8) - 1] = sec;
			fir = 0;
			sec = 0;
		}
		fir *= 2;
		sec *= 2;
		if (i < idx) {
			int c = ip[0][i] - '0';
			fir += c;
			sec += 1;
		}
	}
	ans[0][3] = fir;
	ans[1][3] = sec;
	cout << ans[0][0] << "." << ans[0][1] << "." << ans[0][2] << "." << ans[0][3] << '\n';
	cout << ans[1][0] << "." << ans[1][1] << "." << ans[1][2] << "." << ans[1][3] << '\n';
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 9007] 카누 선수 (C++)  (0) 2022.01.12
[백준 3107] IPv6 (C++, Java)  (0) 2022.01.04
[백준 14940] 쉬운 최단거리 (C++)  (0) 2021.12.26
[백준 19538] 루머 (C++)  (0) 2021.12.24
[백준 16118] 달빛 여우 (C++)  (0) 2021.12.20
Comments