(Java) 백준 2292번 - 벌

코딩너구리·2026년 1월 23일

코딩 문제 풀이

목록 보기
177/266

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

문제

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

접근

1을 기준을 1겹이라고 하자, 그럼 2~7까지 6개는 2겹, 8~19까지 12개는 3겹, 20~37까지 18개는 4겹, 38~61까지 24개는 5겹이 된다. 이때 각 겹은 1, 6, 12, 18, 24개로 이루어져 있고 이는 수식으로 관계를 정의 해보면 6*(i-1)이 된다.
N이 주어졌을 때, 해당 수가 어떤 겹에 있는지 보기 위해 안쪽부터 한겹에 들어있는 수들의 개수를 빼가보면 더 이상 빼면 0보다 작거나 같아지는 겹이 있다. 그럼 그 겹안에 있다는 뜻이다.

문제해결

> i는 겹을 뜻하고, num은 그 겹안에 들어있는 숫자의 개수를 말한다.
> while문으로 입력받은 N에 num을 뺀 값이 0보다 클 때까지 반복해준다. 
> 이는 num을 뺐을 때, 0보다 작거나 같아 진다면 그 N은 해당 i에 있다는 뜻이다.
> 이제 N에서 해당 겹에 있는 수의 개수를 빼준다. 처음엔 1겹에 있는 1개가 감소된다.
> 이제 i를 증가시켜 다음 겹으로 넘어가고, num도 새로 갱신해 다음 겹에 들은 수 의 개수를 구해준다.
> 위 과정을 반복한다.

코드

import java.io.*;
import java.util.*;
import java.lang.*;

public class Main
{
    //2292번 벌집
    public static void main(String[] args) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        int i = 1, num = 1;
        while(N - num > 0)
        {
            N -= num;
            i++;
            num = 6 * (i - 1);
        }
        System.out.println(i);
    }
}

후기

같은 직선상에 있는 애들의 관계도 찾아보고, 육각형 안에 들은 수들의 관계도 찾아보고 했는데 그렇게 되면 58처럼 1과 일직선상에 있지 않은 애들은 애매해진다. 또 육각형 안에 애들도 중구난방이라 규칙이 없었다. 그래서 겹으로 보았다. 겹마다 규칙이 6과 관련된 규칙이었다.

0개의 댓글