본문 바로가기
  • 개발하는 곰돌이
Algorithm/BOJ

[Kotlin] 백준 3107 : IPv6

by 개발하는 곰돌이 2024. 2. 20.

문제 링크

 

3107번: IPv6

첫째 줄에 올바른 IPv6 주소가 주어진다. 이 주소는 최대 39글자이다. 또한, 주소는 숫자 0-9, 알파벳 소문자 a-f, 콜론 :으로만 이루어져 있다.

www.acmicpc.net


문제 해설

문자열 파싱 문제. 조건에 맞게 축약된 IPv6를 원래 IPv6로 복원해야 한다.

 

문제에서 주어진 두가지 조건을 역순으로 생각해보자.

 

  • 0으로만 이루어져 있는 하나 이상의 연속된 그룹을 하나 골라서 콜론 2개(::)로 바꿀 수 있다.

IPv6는 8 그룹의 16진수로 구성되어 있다. 즉, 축약되지 않은 원래 형태는 7개의 콜론으로 16진수 그룹을 나누게 된다.

 

즉, 축약된 IP 주소에서 콜론의 개수가 7개가 되도록 보충을 해주면 된다.

 

split()으로 문자열을 분리하면 빈 문자열이 포함된 문자열 리스트를 얻을 수 있다. 예제 2의 경우 ["", "", "1"]와 같은 문자열 리스트가 되는 것이다. 이를 통해 보충해야 할 콜론의 개수를 구할 수 있다.

":".repeat(8 - split(':').size)

이제 replace()를 사용해서 8 그룹으로 나눠질 수 있도록 축약되어 표시됐던 콜론 2개를 교체해주면 된다. 다만 원래 있던 콜론 2개가 소실되지 않도록 위에서 구한 보충해야 할 콜론의 개수에 2를 더해줘야 한다.

readLine().run { replace("::", ":".repeat(8 - split(':').size) + 2) }
  • 각 그룹의 앞자리 0의 전체 또는 일부를 생략할 수 있다.

각 그룹은 4자리의 16진수로 구성되어 있는데 그룹의 앞자리 0만 생략할 수 있다고 한다. 즉, 모든 그룹이 4자리가 되도록 앞자리를 0으로 채워주고 콜론으로 연결하기만 하면 된다.

ipv6.split(':').joinToString(":") { it.padStart(4, '0') }

Code

fun main() = with(System.`in`.bufferedReader()) {
    val ipv6 = readLine().run { replace("::", ":".repeat(10 - split(":").size)) }
    println(ipv6.split(':').joinToString(":") { it.padStart(4, '0') })
}

댓글