알고리즘 문제 풀이/백준
[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문을 탈출해서 이 때의 층수를 출력하면 문제를 풀 수 있다.
반응형