https://www.acmicpc.net/problem/2064
문제 이해가 좀 어려웠던 문제였다. 결국 이해하게 된 내용은
서브넷 마스크 & 임의의 ip주소 = 네트워크 주소 로 이해했다.
여기서 조건이 하나 있는데 ,가장 크기가 작은(포함되는 IP주소가 가장 적은, 즉 m이 최소인) 네트워크를 구해야한다는 점이다.
받아온 모든 ip주소에 대해 왼쪽부터 오른쪽으로 보면서 다른 부분이 있으면 멈춰야 한다.
먼저 아이피들끼리 비교하여 공통되지 않은 부분이 나올때까지 찾아본다. 만약 공통되지 않은 부분이 있다면 그 부분부터 뒤에는 모두 0으로 채워주도록 한다. 그렇게 구한 서브넷 마스크와 임의의 첫번째 아이피 주소와 &연산을 해주게 되면 답을 구할 수 있게 된다.
import sys
input = sys.stdin.readline
n = int(input())
ip_arr = [input().strip().split('.') for _ in range(n)]
mask_arr = []
net_addr = []
diff = 0
for i in range(4):
min_ip = int(ip_arr[0][i])
max_ip = int(ip_arr[0][i])
for j in ip_arr:
min_ip = min(int(j[i]), min_ip)
max_ip = max(int(j[i]), max_ip)
if 255 == 256 + (~max_ip ^ min_ip):
mask_arr.append(255)
else:
for j in range(9):
if -(~max_ip ^ min_ip) <= 1 << j:
mask_arr.append(256 - (1 << j))
for k in range(3):
mask_arr.append(0)
break
net_addr.append(int(ip_arr[0][i]) & mask_arr[i])
net_mask = mask_arr[:4]
print("{}.{}.{}.{}".format(net_addr[0], net_addr[1], net_addr[2], net_addr[3]))
print("{}.{}.{}.{}".format(mask_arr[0], mask_arr[1], mask_arr[2], mask_arr[3]))