문제

[BaekJoon] 2292 벌집


백준에 있는 일반 수학 문제이다. 일반 수학1 분류에 있는 문제들은 수학 규칙을 찾아 코드로 작성하면 된다. 처음에는 배열생성해서 어찌 해야되나 생각했지만 아니다. 이것은 무한 벌집이다..

Input

1부터 몇 개의 방을 지나가는지 궁금한 벌집의 N번 방

Output

입력으로 주어진 N번 방이 최소 개수의 방을 지나서 갈 때 몇개의 방을 지나는가?


다음 풀이를 보자.

풀이

image

벌집을 잘 보면 1이 중앙에 있고 2 ~ 7, 8 ~ 19, 20 ~ 37 … 이런 식으로 숫자들이 시계방향으로 가면서 증가하는 규칙을 찾을 수 있다.

n = 1 일 때는 방 1개를, n = 2 ~ 7 일 때는 방 2개를, n = 8 ~ 19 일 때는 방 3개를~… 이런 식이다.

지나는 방의 개수가 늘어날 수록 벌집 개수도 동시에 6의 배수 만큼 늘어나는 것이다.

N이 같은 line에 속해있는 수 들은 모두 최소 루트 방 수(지나는 방 갯수) 가 같다.

N 벌집 갯수 지나는 방 갯수(cnt)
1 1 1
2 ~ 7 6 2
8 ~ 19 12 3
20 ~ 37 18 4
38 ~ 61 24 5
62 ~ 91 30 6

Code

1
2
3
4
5
6
7
8
9
10
11
12
import sys

n = int(sys.stdin.readline())

cnt = 1 # 지나온 방 갯수
room = 1 # 벌집 갯수

while n > room:
    room += 6 * cnt # 벌집이 6의 배수씩 증가
    cnt += 1

print(cnt)

while문은 벌집 갯수roomn보다 작아질 때 까지,

room은 벌집 갯수를 나타내는 변수로, 중앙 1부터 시작해서 while문이 반복되는 동안 6의 배수씩 증가한다.

cnt는 지나온 방 갯수로 입력값인 n번 방이 벌집의 몇 번째 겹에 있나를 나타낸다.

Leave a comment