본문 바로가기

컴퓨터/백준 알고리즘

백준 알고리즘 2292번: 벌집 C언어

문제 출처: www.acmicpc.net/problem/2292

 

2292번: 벌집

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌

www.acmicpc.net

1. 코드

#include <stdio.h>

int main(void)
{
    int n, i = 2, j = 5, cnt = 2;
    
    scanf("%d", &n);
    if(n == 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++;
    }
}

2. 문제 해결 방식

우선 그림을 2번 방 3번 방에 해당하는 것들을 체크했다.

그렇다면 이러한 결과를 도출할 수 있다.

N번 방 해당하는 수 해당하는 수의 차이
1번 방 1  
2번 방 2~7 5
3번 방 8~19 11
4번 방 20~37 17
5번 방 38~61 23

해당하는 수의 차이가 6씩 차이가 나는 것을 알 수 있다. (ex 2번 방과 3번 방의 차이는 6, 3번 방과 4번 방의 차이는 6이다.)

이러한 규칙을 이용하여 최대한 경우의 수를 줄여가며 해당하는 방의 첫 수와 마지막 수를 빠르게 식별하여 그 사이에 있다면 해당하는 N번 방을 출력했다. 하지만 입력한 수가 1일 경우는 따로 제외하여서 1을 입력했을 시 1이 나오도록 출력하는 방법으로 해결했다.

3. 느낀 점

최근에 독감에 결렸다가 나아도 계속해서 코가 심하게 막히거나 목이 기침에 계속해서 나와서 최근에 아무것도 하지 못했는데 이제는 많이 나아져서 다시 백준을 풀기 시작했다.

오랜만에 풀어서 그런지 재미있게 풀었던 것 같다. 이 문제 같은 경우에는 규칙을 찾는 재미가 있었다. 규칙을 찾기 전까지는 조금 어려워 보였지만 규칙을 찾은 후에는 눈 깜빡할 사이에 해결 방법을 떠올렸다.