벌집

=ACM ICPC 2004 인터넷 예선 문제 B - 벌집=

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

2. 입력
입력은 표준입력(standard input)을 통해 받아들인다. 입력의 첫 줄에는 테스트 케이스의 개수 T(1 <= T <= 15 ) 가 주어진다. 각 테스트 케이스로는 한 줄에 하나의 방 번호 N(1<= N <=1,000,000 )이 주어진다.

3. 출력
출력은 표준 출력 (standard output)을 통해 출력한다. 각 테스트 케이에 대해서 입력에서 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 한 줄에 하나씩 출력하시오.

Java
code format="java5" import java.util.Scanner;

public class Honeycomb { private static final int SIDE = 6;   // 벌집 면의 수

public static void main(String[] args) { Scanner scan = new Scanner(System.in);

int T = scan.nextInt;   // 테스트 케이스의 개수

for(int i = 0; i < T; i++) { int N = scan.nextInt;   // 방 번호

process(N); }   }

public static void process(int N) { int d = 1;   // 지나가는 방의 개수 int lev = 0;   // 각 레벨의 방의 개수

while(N > 1) { lev += SIDE; N -= lev; d++; }

System.out.println(d); } } code

5. Comment
곰곰히 생각해보면 수열 문제로 생각할 수 있다. 벌집의 레벨이 늘어날때마다 각 레벨의 방의 개수가 6개씩 늘어난다. 중앙의 방에서부터 차례로 빼나가다보면 답이 나온다. 이 녀석은 나를 고민을 많이하게 만들었지만 재밌는 문제였다.