알고리즘 문제 풀이/백준

[Algorithm] 백준 - 벌집 (2292) (Kotlin)

참깨빵위에참깨빵_ 2024. 9. 23. 18:31
728x90
반응형

 

1을 포함한 벌집은 6개의 벌집이 감싸고, 그 밖의 벌집은 12개가 감싼다. 즉 벌집의 방들을 계층화하면 아래와 같다고 볼 수 있다.

 

  • 1층 : 중앙 1개의 방
  • 2층 : 방 6개(2~7)
  • 3층 : 방 12개(8~19)
  • 4층 : 방 18개(20~37)

 

이런 식으로 n층의 방은 몇 개인지 구하려면 6n으로 구할 수 있다. 이를 바탕으로 주어진 숫자가 어떤 층에 속하는지 알면 최소 방의 개수를 몇 개나 지나야 하는지 알 수 있다.

 

fun main() {
    val N = readln().toInt()
    
    if (N == 1) {
        println(1)
        return
    }
    
    var layer = 1
    var maxRoomInLayer = 1

    while (N > maxRoomInLayer) {
        layer++
        maxRoomInLayer += 6 * (layer - 1)
    }

    println(layer)
}

 

1을 입력받았을 경우의 예외처리를 앞에 추가하고 이후 층, 최대 방 개수를 담을 변수를 선언해 둔다.

그리고 반복문을 써서 입력받은 숫자가 최대 방 개수보다 큰 동안 반복한다는 조건을 추가하고, 층을 1개씩 추가하면서 최대 방 개수를 6(n-1)로 업데이트한다.

왜 6(n-1)을 써야 하는가? 만약 6n을 그대로 쓰면 1층의 방 개수는 6개가 되어 버린다. 문제에선 1층의 방 개수는 1개라고 그림으로 표시하고 있고, 2층 이상부턴 6의 배수로 증가하기 때문에 n-1을 해야 1층을 제외하고 올바른 방 개수를 구할 수 있다.

이렇게 반복하다가 언젠간 N이 최대 방 개수보다 작아지는 순간이 온다. 그럼 무한 while문을 탈출해서 이 때의 층수를 출력하면 문제를 풀 수 있다.

반응형