티스토리 뷰

반응형
 

2292번: 벌집

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

www.acmicpc.net

// 1.
const fs = require('fs');
const input = parseInt(fs.readFileSync('/dev/stdin').toString().trim());

// 2.
function* multi() {
  let result = 1, idx = 1, mul = 1;
  while (true) {
    result += mul;
    yield result;
    mul = idx * 6;
    idx++;
  }
}

// 3.
let result = 0;
switch (input) {
  case 0:
    result = 0;
    break;
  case 1:
    result = 1;
    break;
  default:
    let gen = multi();
    for(let i = 1;i<=input;i++) {
      let val = gen.next().value;
      if(val > input) {
        result = i;
        break;
      }
    }
    break;
}

console.log(result);
  1. input을 초기화한다.
  2. 2 - 8 - 20 - 38 - 62와 같이, 벌집의 각 계층 시작점을 반환하는 제너레이터 함수를 작성한다.
  3. 2.의 제너레이터 함수는 input이 0, 1인 경우에 대응할 수 없으므로 switch문을 통해 이를 걸러낸다.
    • 그 외의 경우는 제너레이터 함수를 초기화한 후 이를 사용한다.
    • 변수 val은 제너레이터 함수의 next()메소드를 통해 반환된 각 계층의 시작점이다.
    • 해당 계층의 시작점보다 input이 작은 경우, input 위치는 비교 대상의 이전 계층에 있다고 가정한다.
    • 결과는 해당 시점의 index 값이므로 이를 반환한 후 답을 출력한다.

결과

9436 KB / 184 ms

메모

  • 제너레이터 함수를 쓸 필요는 전혀 없다. 단순 반복문을 사용하는 것이 더 좋을 것임.
  • 근데 그냥 제너레이터 써보고 싶었다.
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함