Study/BOJ

[BOJ] 2064. IP 주소

MuviSsum 2020. 9. 17. 02:40

백준 문제 주소 :

www.acmicpc.net/problem/2064

 

2064번: IP 주소

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

www.acmicpc.net

 

 

비트마스크로 풀려다가 포기하고 문자열로 푼 다음,

다시 비트마스크로 풀은 문제입니다...

돌돌 비트마스크 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

그래서 오늘 올릴 코드는 2개입니다!

문자열 코드와 비트마스크 코드!!

 

** 푼 방법

1. 일단 네트워크 마스크를 구한다.

2. 아무 IP에 네트워크 마스크를 &연산하면 네트워크 주소가 나온다.

끝.

 

하기엔 뭔가 아쉬우니까?

네트워크 마스크는 XOR연산과 NOT연산을 같이해서 NXOR 연산으로 값을 구한 다음,

거기에 256을 더하면 네트워크 마스크가 나옵니다.

이 공식을 이용해서 네트워크 마스크가 앞에서 255아닌게 나오면,

그 나오는 시점부터 뒤의 숫자는 무조건 0이 되게 됩니다.

이해가 안되면 댓글 달아주세욥~

 

문자열 코드

import sys, re
def solution():
    T = int(sys.stdin.readline())
    ips = [sys.stdin.readline().rstrip() for i in range(T)]
    ip = []
    net_addr = []
    net_mask = []
    all_of_mask = []

    # ip 나눠서 받고
    for j in range(4):
        ip += [[int(re.findall('\d+', i)[j]) for i in ips]]

    # 그냥 나눠서 받을 거를 이진수로 바꾼다음,  스트링형태로 바꾸면..?
    # 되긴 되겟지만... 이게 좋은 건가...? 32 * 1000 * 4 * 10 정도라고 치면 시간은 별로 안 들긴 하네
    #

    # ip 4파트 비교
    for part in ip:
        visited = [True] * 8
        tmp = part[0]

        # 초기값잡아주고 그값에서 visited에 False 되어있는 곳 다 0으로 만들 계획
        for i in range(1, len(part)):
            tmp = tmp & part[i]
        str_tmp = str(format(tmp, 'b'))
        while True:
            if len(str_tmp) == 8 :
                break
            else :
                str_tmp = '0'+str_tmp

        # 문자변환
        for jjip in range(len(part)) :
            str_jjip = str(format(part[jjip], 'b'))
            while True:
                if len(str_jjip) == 8 :
                    break
                else :
                    str_jjip = '0'+str_jjip
            part[jjip] = str_jjip

        # visited에 False 삽입
        for k in range(1, len(part)):
            for i in range(8):
                if part[0][i] != part[k][i]:
                    visited[i] = False
        mask = '11111111'
        for i in range(len(visited)):
            if visited[i] == False :
                sig = False
                str_tmp = str_tmp[:i] + '0'*(8-i)
                mask = mask[:i] + '0'*(8-i)
                break
        for i in net_mask:
            if i != '255':
                mask = '00000000'
                str_tmp = '00000000'
        net_addr.append(str(int(str_tmp,2)))
        net_mask.append(str(int(mask,2)))

    # 출력
    print('.'.join(net_addr))
    print('.'.join(net_mask))

solution()

 

비트마스크 코드

import sys
def solution():
    T = int(sys.stdin.readline())
    ips = [sys.stdin.readline().rstrip().split('.') for i in range(T)]
    net_addr = []
    net_mask = []
    for i in range(4):
        min_ip = int(ips[0][i])
        max_ip = int(ips[0][i])
        for tmp_ip in ips:
            if max_ip < int(tmp_ip[i]):
                max_ip = int(tmp_ip[i])
            if min_ip > int(tmp_ip[i]):
                min_ip = int(tmp_ip[i])
        if 255 == 256 + (~max_ip^min_ip):
            net_mask.append(255)
        else:
            for j in range(9):
                if -(~max_ip^min_ip) <= 1<<j:
                    net_mask.append(256 - (1<<j))
                    for k in range(3):
                        net_mask.append(0)
                    break
        net_addr.append(int(ips[0][i])&net_mask[i])
    net_mask = net_mask[:4]
    print("{}.{}.{}.{}".format(net_addr[0], net_addr[1], net_addr[2], net_addr[3]))
    print("{}.{}.{}.{}".format(net_mask[0], net_mask[1], net_mask[2], net_mask[3]))

solution()
반응형

'Study > BOJ' 카테고리의 다른 글

[BOJ] 17070. 파이프 옮기기 1  (0) 2020.10.14
[BOJ] 16236. 아기상어  (0) 2020.10.07
[BOJ] 2206. 벽 부수고 이동하기  (0) 2020.09.16
[BOJ] 11444. 피보나치 수 6  (0) 2020.08.27
[BOJ] 9663. N-Queen  (1) 2020.08.25