[boj] 2661. 좋은수열 (node.js)

호이·2022년 4월 11일
0

algorithm

목록 보기
51/77
post-thumbnail

문제 요약

[boj] 2661. 좋은수열 (node.js)

풀이

  • 1, 2, 3의 세 수만을 사용해서 길이가 N인 '좋은 수열'을 구하는 문제다.
  • 좋은 수열은 수열 내부에서 임의의 길이를 가진 수열을 연속해서 선택했을 때, 그 어떤 수열도 동일하지 않은 경우를 말한다.
  • 조건에 따라 자릿수에 해당하는 수열을 탐색하는 문제이므로, 조건을 만족하는 경우에 대해 재귀함수를 계속 호출해주면 된다.

내 풀이

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let _line = 0;
const input = () => stdin[_line++];

let stdin = [];
rl.on("line", function (line) {
  stdin.push(line);
}).on("close", function () {
  const N = input();
  rec(0, "");

  function rec(k, str) {
    if (k == N) {
      console.log(str);
      process.exit();
    } else {
      for (let i = 1; i <= 3; i++) {
        if (isGood(str + i)) rec(k + 1, str + i);
      }
    }
  }

  function isGood(str) {
    let len = Math.floor(str.length / 2);
    for (let i = 1; i <= len; i++) {
      if (
        str.slice(str.length - i * 2, str.length - i) ==
        str.slice(str.length - i)
      )
        return false;
    }
    return true;
  }
});

주절주절

  • 강의를 들으며 완벽히 이해했다고 생각했던 완전탐색 문제였으나 이번 알고리즘은 꽤나 오랫동안 풀었다. 결국 이전에 풀이했던 N-Queen 알고리즘에서 힌트를 얻어 코드를 수정해 맞을 수 있었다.
  • exit() 를 알고리즘 내부에서 처음 사용했다. 여러 번 재귀함수를 호출하여 결과값을 만들어내는데, return 으로 종료한다면 해당 함수를 호출한 시점으로 돌아가게 되므로, 연쇄적으로 종료될 수 있도록 구현해야 했다.
  • 따라서, 최초로 반환한 답을 제외하고는 더 이상 탐색의 필요성이 없으므로 남은 호출을 모두 종료시키는 방법을 찾아봤고, process.exit()를 활용해 구현할 수 있음을 배워 이 방법으로 구현했다.
profile
매일 부활하는 개복치

0개의 댓글