[백준/BOJ] 2292번 벌집(Node js/javascript)

2023. 8. 25. 18:11코딩 테스트 (BOJ)

 

2292번: 벌집

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

www.acmicpc.net

처음 문제를 읽고 그림을 봤을때는 먼저 이동할때 보이는 숫자들의 규칙을 찾으려고 시도했다.

 

문제 해설

위 벌집을 아래와 같이 [1]을 1번째 layer,  [2,3,4,5,6,7]을 2번째 layer , [20, ... , 37]을 layer 3이라고 해보자. 

그럼 이제 이 찾으려는 숫자가 포함된 layer가  곧 1에서 해당 숫자로 몇번 이동해야 되는지를 나타낸다.

 

 

layer 1 : 1

layer 2 : 2 - 7 (6)
                       
layer 3 : 8 - 19 (12)

layer 4 : 20 - 37 (18)

layer 5 : 38 - 61 (24)

 

그럼 위와같이 layer가 1씩 증가할때마다 layer에 속해있는 최소값과 최대값의 차이가 6씩 증가하는 규칙을 세울 수 있다.

 

Ex) layer 3의 최소값은 [layer 2의 최대값 + 1], 최대값은 [최소값 + 6 * 2 -1] 로 구할 수 있다.

 

이제 위 규칙을 통해 재귀함수로 로직을 짜보자.

전체코드
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim();

var index = 1;
var max = 0;

const count_layer = (min, layer) => {
  max = min + layer * 6 - 1;
  layer++;

  if (input > max) {   // 입력 받은 값이 해당 layer의 최대값보다 크다면 다음 layer로 넘어간다.
    count_layer(max + 1, layer);
  } else {
    console.log(layer);  //아니라면 layer를 출력한다.
    return;
  }
};

if (Number(input) == 1) {
  console.log(1);
} else {
  count_layer(2, index);
}