[Java] 백준 2292번 [벌집] 자바

: ) YOUNG·2022년 1월 15일
2

알고리즘

목록 보기
39/422
post-thumbnail

백준 2292번
https://www.acmicpc.net/problem/2292


문제


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


입력

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


생각하기

사진 때문에 문제가 더 어려워 보이는 경향이 있는 것 같다.

규칙만 찾으면 쉽게 풀 수 있다.

찾는 숫자가 어떤 범주에 들어가는지만 파악하면 된다.

벌집은 중앙에 있는 1부터 시작해서 점점 커지게 된다.
1이 있는 곳을 1층
2 에서 7 까지의 숫자가 있는 곳이 2층
8 ~ 19 까지의 숫자가 있는 곳이 3층

벌집은 육각형의 형태이기 때문에 층이 늘어날 수 록 방의 갯수도 6개씩 늘어난다는 규칙을 가지고 있다.

1층은 1개로 고정이지만 1층의 1에 6을 더해주면 2층의 마지막 방 번호인 7을 구할 수 있다.
마찬가지로 3층은 2층은 6개가 늘었지만 3층은 2층의 2배가 늘어나므로 12개의 방이 들어갈 수 있게 된다.
그렇다면 3층의 마지막 방 번호는 7 + 12의 값인 19가 3층의 마지막 방 번호라는 것을 알 수 있다.

해당 방식의 반복을 통해 내가 찾는 숫자가 어떤 층의 범주에 들어가는지만 파악한다면 정답을 구할 수 있다.

층을 계산할 수 있는floor변수, 각 층에 들어가는 방의 갯수를 room,
해당 층의 마지막 방 번호를 max_range로 변수를 주었다.

TMI

처음에 자꾸 그림에 집착을 해서 규칙을 찾으려고 생쑈를 했는데,
그림이 아니라 숫자를 보니 규칙을 찾을 수 있었다

나무를 보지말고 숲을 보는 습관을 키우자..


코드

import java.io.*;

public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	
		long num = Integer.parseInt(br.readLine());

		int room = 1;
		int floor = 1;
		int max_range = 1;

		for(;;) {

			if(num <= max_range) {
				System.out.println(floor);
				break;
			}

			room = (floor*6);
			floor ++;
			max_range = max_range + room;
		}
	}
}

0개의 댓글