어흥
[백준 2064] IP 주소 (C++) 본문
728x90
반응형
문제 링크: https://www.acmicpc.net/problem/2064
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