[C]백준_2292 : 벌집
2022년 7월 6일에 작성됨
https://www.acmicpc.net/problem/2292
2292번: 벌집
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌
www.acmicpc.net
문제 분석
벌집의 중앙인 1을 중심으로 주위에 방이 몇 개씩 생성되는지를 파악해보고, 최소 몇 개의 방을 지나가는지 구해본다. 1은 1개의 방, 2~7은 2개의 방, 8~19는 3개의 방, 20~37은 4개의 방 . . . 을 지나간다.
소스 코드 (⭕)
#include <stdio.h>
int main(void)
{
int n, i = 2, j = 5, cnt = 2;
scanf("%d", &n);
if (n == 1) // 1인 경우 1을 출력
{
printf("%d", 1);
return 0;
}
while (1) // 무한 반복문
{
if (i <= n && i + j >= n)
{
printf("%d", cnt);
break;
}
i = i + j + 1;
j += 6;
cnt++;
}
return 0;
}
코드 분석
1은 규칙에 맞지 않으므로 먼저 예외 처리를 해준다. if 문을 사용하여 1을 입력했을 때 1을 출력한다.
- i는 각 방에 해당하는 수의 범위에서 첫 번째로 시작하는 수이다.
- j는 각 방에 대한 범위로, 해당하는 수의 첫 번째 수와 마지막 수를 뺀 값이다.
- cnt는 최종적으로 구해야 하는 최소로 지나가는 방 개수이다.
일단 1번 방은 예외 처리를 해주었으므로 2번 방부터 시작하도록 변수 값을 설정해준다.
2번 방에서는 i=2, j=5, cnt=2 이므로 이와 같이 변수를 초기화 해주고, while 문으로 넘어가서 살펴보자.
if문 조건식인 i <= n && i + j >= n은 해당하는 수 사이에 n값이 있는지 판단하는 식이다.
참이라면 그때의 cnt값을 출력하고, 거짓이라면 각각의 값을 다음 방에 맞게 값을 더해주어 다시 n이 범위에 들어가는지 판단하는 과정을 반복한다.
예를 들어 n=12이면,
n = 12
i = 2
j = 5
cnt = 2
if( 2 <= 12 && 7 >= 12) <- 2번 방의 범위에 n이 포함되어 있는지 판단 (거짓)
3번 방의 i, j, cnt 값 설정
i = 2 + 5 + 1 = 8
j = 5 + 6 = 11
cnt = 2 + 1 = 3
if( 8 <= 12 && 19 >= 12) <- 3번 방의 범위에 n이 포함되어 있는지 판단 (참)
따라서 cnt = 3 출력
end
역시나 혼자 풀기엔 아직 어렵다... 코드만 보면 간단해 보이는데 규칙을 찾고 식으로 만들어 보는게 어려웠다.