백준/문제

12787번: 지금 밥이 문제냐

스몰스테핑 2024. 9. 9. 13:26

문제 출처 : https://www.acmicpc.net/problem/12787

 

언어 : Kotlin

 

문제 설명 :

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

  • 황제: "IPv8주소를 저장하는데는 최소 몇 바이트의 공간이 필요할까?"
  • 아람: "당연히 8바이트의 공간이 필요하지"
  • 황제: "아하! 그러면 127.0.0.1이라는 IPv4 주소는 컴퓨터는 모든 수를 이진수로만 저장 하니까 127=01111111, 0=00000000, 0=00000000, 1=00000001로 저장되겠군. 그런데 이 4개의 값은 따로 저장 되는 것이 아니라 하나의 부호가 없는 정수형 변수에 저장되니까 이 변수에는 위 4개의 이진수를 이어 붙인 01111111000000000000000000000001가 저장되겠구나. 음...십진수로 출력하면 2130706433이겠네. "
  • 아람: "응 그렇지"
  • 황제: "그러면 어떤 IPv8주소가 부호가 없는 정수형 변수에 저장 될 때 그 값을 십진수로 바꾸면 어떤 값이 나올까?? 그리고 만약 어떤 부호가 없는 정수를 IPv8 주소로 바꾼다면 어떻게 바꿔줘야 될까?" 
  • 아람: "..... 배고프다.. 밥이나 먹으러 가자!" 

그러자 황제는 고민이 해결될 때까지는 밥을 못 먹으러 간다며 자리를 지킨다. 
여러분이 황제를 도와 아람이와 황제가 점심시간에 맞춰 밥을 먹도록 도와주자.

 

입력 :

입력의 첫째 줄에 테스트 케이스 T가 주어진다.
각 테스트 케이스의 첫 줄에는 변환의 종류를 나타내는 값 M과 변환할 값 N이 주어진다.
M은 IPv8 주소를 부호가 없는 정수로 바꾸는 변환이면 1, 부호가 없는 정수를 IPv8 주소로 바꾸는 변환이면 2가 주어진다.
N은 M이 1일 경우  0~255사이의 정수로 이루어진 IPv8 주소, M이 2일 경우 부호가 없는 정수가 주어진다.
주어지는 부호가 없는 정수의 크기는 64비트 부호가 없는 정수의 범위를 넘어가지 않는다. 

 

출력 :

각 테스트 케이스마다 변환된 값을 출력한다.

 

제한 사항 :

  • 시간 제한 : 1초
  • 메모리 제한 : 128MB

 

입출력 예 :

입력 출력
3
1 70.236.217.197.157.238.150.80
2 5110699119940114000
2 0
5110699119940114000
70.236.217.197.157.238.150.80
0.0.0.0.0.0.0.0

 

풀이 : 

import java.io.BufferedWriter
import java.io.OutputStreamWriter
import java.math.BigInteger

fun main() = with(System.`in`.bufferedReader()) {
    val bw = BufferedWriter(OutputStreamWriter(System.out))

    repeat(readLine().toInt()) {
        val (n, m) = readLine().split(" ")
        when (n) {
            "1" -> {
                val t = m.split(".").map {
                    val cur = Integer.toBinaryString(it.toInt())
                    if (cur.length < 8) cur.padStart(8, '0') else cur
                }
                bw.write("${BigInteger(t.joinToString(""), 2)}\n")
            }
            else -> {
                val t = m.toBigInteger().toString(2).padStart(64, '0').chunked(8).map {
                    it.toInt(2)
                }
                bw.write("${t.joinToString(".")}\n")
            }
        }
    }
    bw.flush()
    bw.close()
}