카테고리 없음

백준 2064 IP주소

밤밭황제 2023. 8. 24. 02:32

문제

https://www.acmicpc.net/problem/2064

 

2064번: IP 주소

네트워크에 연결되어 있는 컴퓨터들은 각각 하나의 IP 주소를 갖게 된다. 그리고 이러한 IP 주소를 갖는 컴퓨터들이 여러 개 모여서 하나의 IP 네트워크를 구성하게 된다. IP 네트워크는 ‘네트워

www.acmicpc.net

 

정답코드

class IpAddress{

    fun solution(){
        var N = readln().toInt()
        var ipAddresses = mutableListOf<Int>()
        for(i in 0 until N){
            var ipAdd = readln()
            ipAddresses.add(ipStrToInt(ipAdd)) // 입력된 ip를 int로 변환해서 저장
        }
        var netMask = getNetMask(ipAddresses, N)
        printIp((ipAddresses[0] and netMask))
        printIp((netMask))

    }

    fun ipStrToInt(ipAdd:String): Int {
        var parsed = ipAdd.split(".")
        var temp = 0
        for(i in 0 until 4){
            temp = temp or (parsed[i].toInt() shl (3 - i ) * 8)
        }
        return temp
    }

    fun getNetMask(ipAddresses:MutableList<Int>, n: Int): Int {
        var subnet = 0
        for(i in 31 downTo 0){
            var bit = 1 shl i
            var isContinue = true
            for(r in 1 until n){
                if((ipAddresses[0] and bit) != (ipAddresses[r] and bit)){
                    isContinue = false
                    break
                }
            }
            if(!isContinue){
                break
            } else{
                subnet = subnet or bit
            }

        }
        return subnet
    }
    fun printIp(ipAdd: Int){
        var ipStr = Integer.toBinaryString(ipAdd).padStart(32, '0')
        var chunks = ipStr.chunked(8)
        var result = mutableListOf<Int>()
        for(i in 0 until 4){
            var n =Integer.parseInt(chunks[i], 2)
            result.add(n)
        }
        println(result.joinToString("."))
    }
}

fun main(){
    var S = IpAddress()
    S.solution()
}

 

주의사항

함수 printIp에서 

var ipStr = Integer.toBinaryString(ipAdd).padStart(32, '0')

이 코드에서 padStart를 사용하여 앞자리를 0으로 채워야한다. 

예를 들어 ip가 10.10.10.10이라고 했을 때 

정수로 변환하면 168430090이고, 이진수는 1010000010100000101000001010이다.

이진수가 28 자리이기때문에 32자리로 만들기 위해 padStart(32, '0') 를 해주어야 한다.

728x90