JAVA/JAVA Algorithm

[백준] 2292번 벌집

오늘의 진 2022. 8. 30. 23:32

문제

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

입력

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

출력

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

 

 

 

 

 

 

(구상)

다음그림처럼 1에서부터 1칸씩 멀어질수록 규칙을 가진다. 

 

2칸 떨어진 수들  2~7  (6개)

3칸 떨어진 수들  8~19 (12개)

4칸 떨어진 수들 20~37 (18개)

5칸 떨어진 수들 38~61(24 개)

 

n칸 멀어질때 마다 6*(n-1) 을 하게 된다. 

1인경우만 따로 주고 나머지의 경우에는 다음의 규칙을 적용하여 바운더리를 설정해 줘서 풀어보겠다. 

range =2

range = range+(6*cnt);

라고 준다고 하면 

range 2 8 20 38 62
cnt 1 2 3 4 5

이런식으로 되서 떨어진 칸들을 바운더리로 했을떄의 range 는 각각의 범위의 첫값 이 된다. 

 

 

package codingTest;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Algorithm18 {

	public static void main(String[] args) throws Exception {

		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

		int n = Integer.parseInt(bf.readLine());

		int range = 2;
		int cnt = 1;

		if (n == 1) {
			System.out.println(1);
		} else {

			while (range <= n) {

				range = range + (6 * cnt);
				cnt++;

			}

			System.out.println(cnt);

		}

	}

}

 

'JAVA > JAVA Algorithm' 카테고리의 다른 글

[백준] 2675번 문자열 반복  (0) 2022.09.05
[백준] 11720번 숫자의 합  (0) 2022.08.31
[백준] 1110번 더하기 사이클  (0) 2022.08.29
[백준] 2884번 알람시계  (0) 2022.08.28
[백준] 18258번 큐2  (0) 2022.08.28