[백준] 3107번 IPv6

Greenddoovie·2021년 12월 23일
0

백준

목록 보기
15/30

3107번 IPv6

접근 방법

규칙2) 만약 0으로만 이루어져 있는 그룹이 있을 경우 그 중 한 개 이상 연속된 그룹을 하나 골라 콜론 2개(::)로 바꿀 수 있다. 이 규칙은 한 번만 사용할 수 있다.

받은 입력값을 ":"를 기준으로 split을 해주었습니다.

1.

(::)이 있는 경우를 잡기 위한 분기문을 만들어 처리했습니다.
split을 했을 때, (::)는 ["", ""]로 분리되므로
""를 만났을 때 8 - count( it != "")를 구해 해당 값 만큼 "0000"을 list에 add하였습니다.

8 - count( it != "")를 한 이유는 총 갯수가 8개이고 ""가 아닌 갯수만큼 빼면 축약된 그룹이 몇 개인지 파악할 수 있기 때문입니다.

그리고 rule2가 적용된 그룹을 처리했는지 파악하기 위한 flag를 만들어 다음 ""의 원소는 무시하였습니다.

2.

문자열이 존재하는 경우, 길이가 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()
}
profile
기초를 이해하면 세상이 다르게 보인다

0개의 댓글