본문 바로가기

PS/백준

[백준/2292번/java] - 벌집

 

import java.util.Scanner;

public class Main {
    /**
     * 1. N 입력받기
     * 2. N 이 어디에 속해있는지 확인하기 (while 문으로)
     * 3. 계산 알고리즘에 따라 계산하기
     * 3-1. N 이 1 이면 1출력
     * 3-2. 아닌경우 알고리즘에 따라
     * 4. 겹수 출력
     */
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int N = scan.nextInt();

        int num = 2;
        int x = 1;
        while(true){
            if(N == 1){
                num = 1;
                break;
            }
            if(N > (6*x)+1){
                x += num;
                num++;
            }else{
                break;
            }
        }

        System.out.println(num);
    }
}

 

먼저 scanner 로 N 을 입력받는다.

그 다음 벌집을 자세히 살펴보자! 한 겹마다의 최대 수를 보면 6의 배수 에 1을 더한 수가 최대임을 확인할 수 있다. 

그리고 같은 겹에 있는 모든 숫자는 같은 갯수의 방을 지나가게 되어있다. 숫자에 따라 다른게 아니라 몇번째 겹에 있냐에 따라 다르다는 걸 확인할 수 있다. 따라서 겹수를 구해보자!

 

첫번째 겹의 최대인 7은 (6 * 1) + 1 

두번째 겹의 최대인 19는 (6 * 3) + 1

세번째 겹의 최대인 37은 (6 * 6) +1

네번째 겹이 최대인 61은 (6 * 10) +1 이다. 1,3,6,10 은 각각 2,3,4 를 더해서 만들어지는 수다. 

잘보면 두번째 겹에서는 2가 더해지고, 세번째 겹에서는 3이 더해지는 걸 확인할 수 있다.

 

코드로 돌아가보자

num 은 몇번째 겹인지 나타내는 변수, x 는 범위를 체크해주기 위한 변수다.

첫번째 1을 입력받으면 이동할 방이 없으므로 1을 출력해준다.

그 다음부터는 범위에 따라서 해당 숫자가 몇번째 겹 안에 있는 숫자인지를 판별해주기 위해 if 문을 사용하였다.

만약에 저 범위 안에 포함된다면 더 바깥쪽 범위에 있는 숫자라는 것을 의미하기 때문에 우리가 구한 규칙에 따라 x 값을 업데이트 해주고, 겹수를 의미하는 num 도 하나 올려준다.

 

if 문에 써놓은 범위를 만족하지 못한다면 해당 겹에 있는 숫자라는 의미이므로 while 문을 빠져나오고 겹수를 의미하는 num을 출력해주면 된다!


끝!