Algorithm/Baekjoon(Java)

[백준/JAVA] 2292 : 벌집 ( 기본 수학 1 )

비망노트 2022. 7. 31. 12:50
문제

위의 그림과 같이 육각형으로 이루어진 벌집이 있다.

그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다.

숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때

몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오.

예를 들면, 13까지는 3개, 58까지는 5개를 지난다.

입력

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

출력

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

예제 입력 예제 출력
13 3

 

⭕ 풀이

import java.io.*;

public class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int num = Integer.parseInt(br.readLine());
        br.close();
        
        int i=1;
        int sum = 1;
        while(true){
            if(num<=sum){
                break;
            }
            sum += i*6;
            i++;
        }
        System.out.print(i);
    }
}

✅ 풀이과정

1
2~7 ( 6 개 )    2번
8~19 ( 12개 )    3번
20~37 ( 18개 )    4번
38~61 ( 24개 )    5번
62~91 ( 30개 )    6번

 

처음엔 i 를 1씩 증가시키며 num과 i*6을 비교하려했지만 그렇게 작성할경우

num은 6과비교 그다음은 12와 비교 그다음은 18과 비교가된다.

하지만 처음엔6과 그다음엔 12와비교가 아닌 12를 더한 18과비교하고

그 다음엔 18과 비교를 하는게 아닌 18을 더한 36과 비교를 하도록 해야한다.

 

그부분을 구현하기위해 sum이라는 변수를 주고 거기에 i*6을 누적해 비교하도록 작성했다.

sum의 초기값을 1로 하여 처음엔 sum += 1*6을 해 7을 만들어 해당값보다 작거나 같으면 탈출

하고 지금까지 몇번의 방을 지났는지 즉 몇번을 누적합했는지를 세고있던 i를 출력한다.

 

 

 

-출처

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