본문 바로가기

Algorithm/Java

[백준알고리즘] 2292번 벌집 (JAVA)

문제

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

 

입력

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

 

출력

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

 

예제

 

풀이

import java.util.*;
import java.lang.*;
import java.io.*;
 
class Main{
   public static void main (String[] args) throws java.lang.Exception   {
      Scanner sc = new Scanner(System.in);
      int n = sc.nextInt(); 
 
      int room = 1; // 방
      int range = 2; // 범위
 
      while (true) {
         if(n < range){ // n이 방 수보다 작을 경우 break
            break;
         } else {
            range += 6*room; // 다음 범위의 최소값으로 범위 변경
            room++; // 방 수 증가
         }
      }
      System.out.print(room);
   }
}

1번 /  1 / 1개
2번 / 2~7 / 6개
3번 / 8~19 / 12개
4번 / 20~37 / 18개 ... 이런 규칙이 적용된다.
이 문제의 규칙은 등차수열! 

1. 벌집의 방 수와 범위 선언

2. while문으로 반복
입력한 값 n이 범위보다 작을 경우 break. n과 같으면 안됨!! 예를 들어 n이 1일 경우 범위 2보다 작기 때문에 while문을 빠져나간다. 
그렇지 않을 경우(범위 안에 n이 있는 경우)
1) 방 1씩 늘리기
2) 하나의 조건이 끝나고 다음 방과 다음 방의 범위로 넘어가야하기 때문에 범위는 방에 6을 곱해주고, 원래의 범위 값도 같이 더해준다. range = range + 6*room. 즉 다음 범위의 최솟값으로 범위가 변경된다. 예를 들어 2번째 방일 경우 범위의 최솟값인 8이 range가 된다.

 

출처

www.acmicpc.net/problem/2292

 

2292번: 벌집

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌

www.acmicpc.net

 

반응형