백준 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
로 변수를 주었다.
처음에 자꾸 그림에 집착을 해서 규칙을 찾으려고 생쑈를 했는데,
그림이 아니라 숫자를 보니 규칙을 찾을 수 있었다
나무를 보지말고 숲을 보는 습관을 키우자..
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; } } }