규칙2) 만약 0으로만 이루어져 있는 그룹이 있을 경우 그 중 한 개 이상 연속된 그룹을 하나 골라 콜론 2개(::)로 바꿀 수 있다. 이 규칙은 한 번만 사용할 수 있다.
받은 입력값을 ":"를 기준으로 split을 해주었습니다.
(::)이 있는 경우를 잡기 위한 분기문을 만들어 처리했습니다.
split을 했을 때, (::)는 ["", ""]로 분리되므로
""를 만났을 때 8 - count( it != "")
를 구해 해당 값 만큼 "0000"을 list에 add하였습니다.
8 - count( it != "")
를 한 이유는 총 갯수가 8개이고 ""가 아닌 갯수만큼 빼면 축약된 그룹이 몇 개인지 파악할 수 있기 때문입니다.
그리고 rule2가 적용된 그룹을 처리했는지 파악하기 위한 flag를 만들어 다음 ""의 원소는 무시하였습니다.
문자열이 존재하는 경우, 길이가 4이면 정상적인 그룹.
길이가 4 미만이면 앞에 "0"을 붙혀 주었다.
각 결과를 List에 add하였고, 이후 하나의 문자열로 만들어 출력했다
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
class IO3107 {
private val br = BufferedReader(InputStreamReader(System.`in`))
private val bw = BufferedWriter(OutputStreamWriter(System.out))
fun getIPv6(): String = br.readLine()
fun flush() = bw.flush()
fun close() = bw.close()
fun write(message: String) = bw.write(message)
}
fun main() {
val io = IO3107()
val contractions = io.getIPv6().split(":")
val ipv6 = mutableListOf<String>()
var rule2 = false
contractions.forEach { str ->
if (str == "" && !rule2) {
repeat(8 - contractions.count { it != "" }) { ipv6.add("0000") }
rule2 = !rule2
} else if ( str =="") {
return@forEach
} else {
val origin = if (str.length < 4) {
var added = ""
repeat(4 - str.length) {
added += "0"
}
"$added$str"
} else {
str
}
ipv6.add(origin)
}
}
io.write(ipv6.reduce { acc, s -> "$acc:$s" })
io.flush()
io.close()
}