Python - [백준]2064-IP주소

Paek·2023년 2월 2일
0

코테공부

목록 보기
17/44
post-custom-banner

출처

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]))

참고 : https://txegg.tistory.com/112

profile
티스토리로 이전했습니다. https://100cblog.tistory.com/
post-custom-banner

0개의 댓글