글 작성자: 개발섭

안녕하세요. 오늘 풀어볼 문제는 벌집입니다. 

벌집은 단순히 수학적 공식으로도 풀수 있는 문제이지만, (결국 그게 수학적인 규칙성을 찾아서 공식화 시킨거긴 하지만.) 그 공식 과정을 직접 일일히 대조하는 방식으로 진행했습니다.

저는 일단 인접한 방들을 기점삼아서 즉 2~7까지 인접해 있는 수들의 규칙성을 확인해보는 식으로 수를 만들어 갔습니다.

첫번째 1을 거쳐서 방을 지나가기때문에 다음 방은 2일것이니

N =2  2, 3, 4, 5, 6, 7  

N=3  9, 11, 13, 15, 17, 19

N=4 22, 25, 28, 31, 34, 37

..... 

계속 이런식으로 진행하게 될것입니다. 

그 그림들로 보시면 N은 각 방을 지나서 갈수 있는 곳이고, 그 수에 있는 수들이 색깔별로 늘어나가는 숫자라고 생각하면 됩니다.

근데 이 N속에서도 또한 규칙이 존재합니다. 


N=2:  2, 3, 4, 5, 6, 7  각 단위 넘어갈때마다 +1 맨 끝자리 수 +2은 N=3 첫번째 수

N=3:  9, 11, 13, 15, 17, 19 각 단위 넘어갈때마다 +2 맨 끝자리 수 +3은 N=4 첫번째 수

N=4: 22, 25, 28, 31, 34, 37 각 단위 넘어갈때마다 +3 맨 끝자리 수 +4 은 N=5 첫번째 수

.......

즉, 각 단위 넘어갈때마다 +N-1 맨 끝자리 수 +N은 N의 N+1의 첫번째 수 방식으로 진행됩니다.


대신 유의점 하나. 회색으로 칠해지는 부분은 무조건 방 한칸이 늘어나니까 방한칸 셈치고 생각해줘야합니다.


저는 그래서 이런 것을 감안해서 완전히 다 계산해보는 것도 괜찮다고 생각했습니다.

아예 이런 규칙성을 이용해서 이중배열을 통해서 N값에 따라서 그 수의 방 위치를 어느정도 알수 있다고 생각했습니다.

그래서 이 수를 입력해서 N의 범위를 조금 넘는 선에서 N을 작성만들어서 for문을 이 이중배열을 채워가면서 N보다 큰지 확인을 합니다.

N보다 이 수가 크다면, 그때의 [n]을 기록해서 출력해냅니다.


/* 2019.03.06 브루트포스로 때려맞춰보기. 

 * 이중 for문 탈출시 label 이용하는 전략은 상당히 유용한듯.

 * 

*/

package codeBaekJoon;


import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.Arrays;


public class No2292_honeycombs {

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

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

int T = Integer.parseInt(br.readLine());

int check[][] = new int [25003][6];

Arrays.fill(check[1], 1);

int ni =0;

check[2][0] =2;

outloop:

for(int i = 2; i<25002; i++){

for(int j =1; j<6; j++){

check[i][j] = check[i][j-1]+i-1;

if(check[i][j]>=T){

ni=i;

break outloop;

}

}

check[i+1][0]=check[i][5]+i;

if(check[i+1][0]>T){

ni=i+1;

break outloop;

}

}

if(T!=1){

System.out.println(ni);

}

else{

System.out.println(1);

}

}

}