문제 출처 : https://www.acmicpc.net/problem/3107
언어 : Kotlin
문제 설명 :
IPv6은 길이가 128비트인 차세대 인터넷 프로토콜이다.
IPv6의 주소는 32자리의 16진수를 4자리씩 끊어 나타낸다. 이때, 각 그룹은 콜론 (:)으로 구분해서 나타낸다.
예를 들면, 다음과 같다.
2001:0db8:85a3:0000:0000:8a2e:0370:7334
32자리의 16진수는 사람이 읽고 쓰기에 불편하고, 대부분의 자리가 0이기 때문에 아래와 같이 축약할 수 있다.
- 각 그룹의 앞자리의 0의 전체 또는 일부를 생략 할 수 있다. 위의 IPv6을 축약하면, 다음과 같다
2001:db8:85a3:0:00:8a2e:370:7334
2. 만약 0으로만 이루어져 있는 그룹이 있을 경우 그 중 한 개 이상 연속된 그룹을 하나 골라 콜론 2개(::)로 바꿀 수 있다.
2001:db8:85a3::8a2e:370:7334
2번째 규칙은 모호함을 방지하기 위해서 오직 한 번만 사용할 수 있다.
올바른 축약형 IPv6주소가 주어졌을 때, 이를 원래 IPv6 (32자리의 16진수)로 복원하는 프로그램을 작성하시오.
입력 :
첫째 줄에 올바른 IPv6 주소가 주어진다. 이 주소는 최대 39글자이다. 또한, 주소는 숫자 0-9, 알파벳 소문자 a-f, 콜론 :으로만 이루어져 있다.
출력 :
첫째 줄에, 입력으로 주어진 IPv6의 축약되지 않은 형태를 출력한다.
제한 사항 :
- 시간 제한 : 1초
- 메모리 제한 : 128MB
입출력 예 :
입력 | 출력 |
25:09:1985:aa:091:4846:374:bb | 0025:0009:1985:00aa:0091:4846:0374:00bb |
::1 | 0000:0000:0000:0000:0000:0000:0000:0001 |
풀이 :
예제 2번 기준, readLine().split(":")를 하게 되면 [, , 1] 총 3개가 나온다.
IPv6는 4자리 씩 끊어 총 8개 이므로 더 추가해야할 양은 보여진다.
"0000:0000"이 몇개든 전부 줄여서 "::" 단 두개로만 표현되므로 "::"를 기준으로 8개 - 나눈 크기 + 2 만큼 반복시켜서 추가해주면 split했을때 8개의 공간이 나오게 된다.
이 상태에서 각 요소의 앞에서부터 0을 채워주면 된다.
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
readLine().run {
replace("::", ":".repeat(8 - split(":").size + 2))
}.also {
bw.write(it.split(":").joinToString(":") { it.padStart(4, '0') })
}
bw.flush()
bw.close()
}
'백준 > 문제' 카테고리의 다른 글
15947번: 아기 석환 뚜루루 뚜루 (0) | 2024.04.15 |
---|---|
12780번: 원피스 (0) | 2024.04.15 |
11367번: Report Card Time (0) | 2024.04.12 |
14726번: 신용카드 판별 (0) | 2024.04.12 |
4597번: 패리티 (0) | 2024.04.11 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!