본문 바로가기
Programming/Algorithm

[백준] 2292번 : 벌집 (Java)

by 안녕주 2021. 7. 28.

문제

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

입력

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

출력

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


코드

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();

        int count = 1; // 겹 수(최소 루트)
		int range = 2;	// 범위 (최솟값 기준) 

        if (N == 1){
            System.out.println(1);
        }
        else {
            while(range <= N){
                range = range + (6 * count);
				count++;
            }
            System.out.println(count);
        }
    }
}

풀이

처음에는 아래와 같이 코드를 짰다. 하지만 틀렸다. 출력은 제대로 되었지만 어느 부분에서 틀렸는지는 잘 모르겠다.

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int i = 1;

        int before = 1;
        while(true){
            int after = before + 6 * i;
            if (N == 1){
                System.out.println(1);
                break;
            }
            if( (before <= N) && (N <= after)){
                System.out.println(i+1);
                break;
            }
            before = after +1;
            i++;
        }
    }
}

 

문제를 보면 벌집들 사이의 규칙이 있는 것을 알 수 있다.

N 벌집 개수 COUNT
1 1 1
2 ~ 7 6 2
8 ~ 19 12 3
20 ~ 37 18 4
38 ~ 61 24 5

이 원리를 사용해서 문제를 풀면 된다. 

계속 틀렸습니다가 나와서 구글링을 해서 문제를 풀었다.

 

if ( N 이 1 일경우 ) 바로 1을 출력한다.

else ( range (범위)가 N 을 넘기 직전까지 ) 최솟값 range를 계속 증가시켜주는 것이다.

그리고 count는 계속 증가 시킨다.

 

만약 N이 range범위를 넘어가면 해당 범위의 벌집이 아니게 되므로 반복문은 끝나고 이전의 count를 출력하면서 끝난다.

내가 이전에 푼 코드는 두 범위를 다 설정해줘서 코드가 길어졌는데 하나로만 하니 훨씬 간결하고 짧게 끝났다.

 

댓글