[코딩테스트][백준] 🔥 백준 2064번 "IP 주소" 문제: Python으로 완벽 해결하기! 🔥

김상욱·2024년 9월 21일
0
post-thumbnail

문제 링크

https://www.acmicpc.net/problem/2064

🕒 Python 풀이시간: 30분

n=int(input())
ips=[]

for i in range(n):
    ip=list(map(int,input().split('.')))
    ips.append(ip)

def makeNetworkIP(ips):
    ipNetwork=[0]*4
    netWorkMask=[0]*4
    for byte in range(4):
        for bit in range(8):
            defaultBit=(ips[0][byte]>>(8-1-bit))&1
            for i in range(1,n):
                if defaultBit^((ips[i][byte]>>(8-1-bit))&1):
                    return ipNetwork,netWorkMask
            ipNetwork[byte]|=(defaultBit<<(8-1-bit))
            netWorkMask[byte]|=1<<(8-1-bit)
    return ipNetwork,netWorkMask

ipNetwork,netWorkMask=makeNetworkIP(ips)
print(".".join(map(str,ipNetwork)))
print(".".join(map(str,netWorkMask)))

"IP 주소로 네트워크 주소와 마스크 구하기! 🌐🔍

IP 주소는 .으로 구분되어 있는 4개의 0~255 사이의 수로 이루어져 있다. 그렇기에 각 수들을 8비트의 이진 수로 변경할 수 있다. 이 때, 앞에서 부터 비트를 따졌을 때, 비트가 완전히 일치하는 구간을 그대로 가지고 있으며 뒷부분이 0인 것을 네트워크 주소, 비트가 완전히 일치하는 구간을 1로 가지고 있으며 뒷부분이 0인 것을 네트워크 마스크라고 한다. 이 때, 일치하는 구간을 공통적으로 갖는 주소들을 해당 네트워크 주소와 네트워크 마스크를 갖는 IP 주소라고 할 수 있다. 이 때, N개의 IP 주소가 주워졌을 때, 역으로 네트워크 주소와 네트워크 마스크를 구하는 문제이다.

즉, 주워진 IP 주소들이 앞에서 부터 어디까지 공통된 비트를 가지고 있는지를 구하면 되는 간단한 문제이다. 4의 길이를 갖는 배열로 각 N개의 IP 주소들을 받아서 이를 앞의 비트부터 확인한다. 첫번째의 비트를 기준으로 하나 두고 이 것과 다른 비트들이 다른지를 xor 연산으로 비교한다. 하나라도 다르면 이 비트를 우리가 구하는 정답에 반영하지 않고 return 시킨다. 전부 일치한다면 해당 비트를 네트워크 주소에는 해당 비트를 그대로 반영하고 네트워크 마스크에는 1로 반영한다.

출력은 join을 이용하여 .로 다시 구분하여 출력한다. 이 때, join은 문자열 배열에서만 이어서 붙일 수 있기 때문에 str로 mapping을 해준다.

이렇게 Python로 백준의 "IP 주소" 문제를 해결해보았습니다. 코드와 개념 설명을 참고하여 문제를 해결하는 데 도움이 되셨길 바랍니다! 😊

0개의 댓글