백준/문제
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()
}