[C]백준_2292 : 벌집

Alal11·2022년 7월 6일
0
post-thumbnail

출처

https://www.acmicpc.net/problem/2292


문제

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.


입력

첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.


출력

입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.


➡️문제 분석

벌집의 중앙인 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_s("%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

역시나 혼자 풀기엔 아직 어렵다... 코드만 보면 간단해 보이는데 규칙을 찾고 식으로 만들어 보는게 어려웠다.

0개의 댓글