알고리즘

[백준] 12787. 지금 밥이 문제냐

담쏙 2021. 9. 16. 21:53
728x90

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

 

12787번: 지금 밥이 문제냐

평소에 전공 공부를 열심히 하는 황제는 시험기간에 형들이 IPv4, IPv6주소를 저장하는데 각각 최소 4바이트, 6바이트가 필요하다는 얘기를 듣고 아람이에게 질문했다. 황제: "IPv8주소를 저장하는

www.acmicpc.net

M == 1 일 때, 이진수로 변환했다가 다시 십진수로 변경해주는 것이 아니라 '.'을 기준으로 256**(8-i)를 곱해주면 간단하게 풀린다. 예시에 있는 01111111000000000000000000000001을 보면 01111111/00000000/00000000/00000001 인데 이들은 각각 127*(256^3) + 0*(256^2) + 0*(256^1) + 1*(256^0)인 것이다. 

import sys
input = sys.stdin.readline
T = int(input())


def binary(num):
    if num < 2:
        return str(num)
    return binary(num // 2) + str(num % 2)


def decimal(num):
    temp = 0
    idx = 0
    for k in range(len(num)-1, -1, -1):
        if int(num[idx]):
            temp += 2**k
        idx += 1
    return temp


for tc in range(1, T+1):
    # 부호 X : 1, 부호 O : 2
    M, N = input().split()
    if M == '1':
        answer = 0
        n_list = N.split('.')
        for i in range(0, 8):
            answer += int(n_list[i])*(256**(7-i))
        print(answer)

    else:
        b_n = binary(int(N))
        b_n = '0'*(64 - len(b_n)) + b_n
        print('.'.join([str(decimal(b_n[i:i+8])) for i in range(0, len(b_n), 8)]))

 

'알고리즘' 카테고리의 다른 글

[백준] 1931. 회의실 배정  (0) 2021.09.24
[백준] 9935. 문자열 폭발  (0) 2021.09.18
[SWEA] 1218. 괄호 짝짓기  (0) 2021.09.16
[백준] 19583. 싸이버개강총회  (0) 2021.09.15
[백준] 21737. SMUPC 계산기  (0) 2021.09.15