Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋ฐฑ์ค€ 14651 ๊ฑท๋‹ค๋ณด๋‹ˆ ์‹ ์ฒœ์—ญ ์‚ผ (Large)

Ama_grammer 2025. 1. 2. 23:55

๐Ÿ“–๋ฌธ์ œ

๊ฑท๋‹ค๋ณด๋‹ˆ ์‹ ์ฒœ์—ญ ์‚ผ

โ“๊ตฌ์ƒ

N์ž๋ฆฌ์ˆ˜์˜ ์ˆซ์ž์—์„œ 0, 1, 2 ๋งŒ ๊ฐ€์ง€๊ณ  ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” 3์˜ ๋ฐฐ์ˆ˜์˜ ๊ฐฏ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ผ์ • ํŒจํ„ด์ด ์žˆ๋Š”์ง€ ํŒŒ์•…์„ ํ•˜๋ฉด ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ™œ์šฉํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋œ๋‹ค. ์šฐ์„ , ์ž…๋ ฅ๊ฐ’ N ์— ๋”ฐ๋ฅธ ์ถœ๋ ฅ ๊ฐฏ์ˆ˜๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ์ถœ๋ ฅ๊ฐ’์„ ํŒŒ์•…ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

ํŒจํ„ดํŒŒ์•…์„ ์œ„ํ•œ ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ.

const result = [];
const N = 10;
const backTracking = (arr, line) => {
  if (line.length !== N) {
    const len = arr.length;
    for (let i = 0; i < len; i++) {
      const copyArr = [...arr];
      const copyLine = [...line];
      const num = copyArr[i];
      copyLine.push(num);
      backTracking(copyArr, copyLine);
    }
  } else {
    if (line[0] !== 0) {
      const num = +line.join("");
      !(num % 3) && result.push(num);
    }
    line = [];
  }
};
backTracking([0, 1, 2], []);
console.log(result.filter((e) => !(e % 3)).length % 1000000009);

 

 

์ถœ๋ ฅ

์œ„์˜ ์ฝ”๋“œ๋กœ N์ด 2, 4, 5, 6, 7, 8, 9 ์ผ๋•Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•จ์œผ๋กœ 1์—์„œ 10 ๊นŒ์ง€ N์— ๋”ฐ๋ฅธ ์ถœ๋ ฅ๊ฐ’์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

1 -> 0
2 -> 2
3 -> 6
4 -> 18
5 -> 54
6 -> 162
7 -> 486
8 -> 1458
9 -> 4374
10 -> 13122

 

+ ) ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ๋„ ์ด ๋ฌธ์ œ๊ฐ€ ์š”๊ตฌํ•˜๋Š” ์ถœ๋ ฅ๊ฐ’์„ ์ถฉ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด ์ถ”๊ฐ€๋กœ ์ œ์ถœํ•ด ๋ณด์•˜๋‹ค.

๊ฒฐ๊ณผ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ 

์ด์œ ๋Š” ๋™์  ๊ณ„ํš๋ฒ•์€ ๊ณต๊ฐ„๋ณต์žก๋„๊ฐ€ ์ €์žฅํ•ด์•ผํ•  ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ์— ์˜ํ•ด ๊ฒฐ์ •๋˜๋Š”๋ฐ ๋ฐฑํŠธ๋ž˜ํ‚น์€ ์žฌ๊ท€ ํ˜ธ์ถœ์— ์‚ฌ์šฉ๋˜๋Š” ํ˜ธ์ถœ ์Šคํƒ ํฌ๊ธฐ์™€ ์„ ํƒ์ง€๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ณต๊ฐ„์— ๋”ฐ๋ผ ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ฆ‰, ๋™์  ๊ณ„ํš๋ฒ•์€ ๊ณต๊ฐ„๋ณต์žก๋„๊ฐ€ O(n) ์ด์ง€๋งŒ ๋ฐฑํŠธ๋ž˜ํ‚น์€ O(d) (d : ํƒ์ƒ‰์˜ ์ตœ๋Œ€ ๊นŠ์ด) ์ด๋‹ค.

๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ์‹œ๋„ํ•œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด 

if (line.length !== N)

line ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ N ์„ ๋งŒ์กฑํ•  ๋•Œ ๊นŒ์ง€ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ๋ฐ˜๋ณต ํ•œ๋‹ค.

ํŠนํžˆ๋‚˜ ์ด ๋ฌธ์ œ๋Š” N ์˜ ๋ฒ”์œ„๊ฐ€ 1 ์ด์ƒ 33,333 ์ดํ•˜์˜ ์กฐ๊ฑด์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ ๋‹นํ•œ ์ˆ˜์ค€์˜ N ์ด ์ž…๋ ฅ๋œ๋‹ค๋ฉด ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ ์ปค๋ฒ„๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒ ์œผ๋‚˜, N ์˜ ๊ฐ’์ด ์ปค์ง€๋Š” ๊ฒฝ์šฐ ์ค‘๋ณต๊ณ„์‚ฐ์ด ๋งŽ์•„์ง€๊ฒŒ๋˜๊ณ  ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฐ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ์•Œ์•„๋‚ธ ์ถœ๋ ฅ๊ฐ’์œผ๋กœ ๋™์ ๊ณ„ํš๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์˜ณ๋ฐ”๋ฅผ ๊ฒƒ์ด๋‹ค.

์ฝ”๋“œ.

const N = +require("fs").readFileSync("./input.txt", "utf-8").trim();
const dp = [0, 2];
const solution = (n) => {
  for (let i = 2; i < n; i++) {
    if (dp[i]) dp[i];
    else dp[i] = (dp[i - 1] * 3) % 1000000009;
  }
};
solution(N);
console.log(dp[N - 1]);

 

ํŒจํ„ด์„ ํŒŒ์•…ํ•ด๋ณด๋‹ˆ f(i) ์˜ ๊ฐ’์€ f(i - 1) ์˜ ๊ฐ’์— 3 ์„ ๊ณฑํ•œ ๊ฐ’๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

dp ๋ฐฐ์—ด์˜ ์ดˆ๊นƒ๊ฐ’์„ [0, 2] ๋กœ ์„ค์ •ํ•ด์ฃผ์—ˆ๊ณ , ์ธ๋ฑ์Šค๋Š” ํ•ญ์ƒ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— dp ๋ฐฐ์—ด์˜ N - 1 ๋ฒˆ์งธ ๊ฐ’์„ ์ถœ๋ ฅํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

 

๊ฐœ์„ ์ฝ”๋“œ.

์ž‘์„ฑํ–ˆ๋˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋˜ ์ค‘ ๋ฌธ์ œ์—์„œ๋Š” 

์ˆซ์ž๊ฐ€ ๋„ˆ๋ฌด ์ปค์งˆ ์ˆ˜ ์žˆ๊ธฐ์— dp[N-1] ์˜ ๊ฐ’์„ 10^8 + 9(1,000,000,009) ๋กœ ๋‚˜๋ˆˆ ๊ฐ’์˜ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋ผ๊ณ  ํ•œ๋‹ค.

๋‹คํ–‰์ด ์œ„์˜ ์ฝ”๋“œ๋กœ๋„ ๋ฌธ์ œ๋Š” ์—†์ด ์ถœ๋ ฅ๋˜์—ˆ๊ณ  ์žฌํ™•์ธ ํ•ด๋ณธ ๊ฒฐ๊ณผ N์ด 33,333์ธ ๊ฒฝ์šฐ์—๋„ ์ถœ๋ ฅ๊ฐ’์€ ๋™์ผํ–ˆ์ง€๋งŒ ๋ฌธ์ œ์˜ ์กฐ๊ฑด์— ์ข€๋” ์ ์ ˆํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ–ˆ๋‹ค.

const N = +require("fs").readFileSync("./input.txt", "utf-8").trim();
const dp = [0n, 2n];
const solution = (n) => {
  for (let i = 2; i < n; i++) {
    if (dp[i]) dp[i];
    else dp[i] = dp[i - 1] * 3n;
    // ๊ธฐ์กด ์ฝ”๋“œ : else dp[i] = (dp[i - 1] * 3) % 1000000009;
  }
};
solution(N);
console.log(`${dp[N - 1] % 1000000009n}`);
// ๊ธฐ์กด ์ฝ”๋“œ : console.log(`${dp[N - 1]}`);

 

๐Ÿ”ฅ๋ฐฐ์šด ์ 

์—ฐ๋‹ฌ์•„ ๋™์ ๊ณ„ํš๋ฒ• ๊ด€๋ จ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ’€๊ณ  ์žˆ๋Š”๋ฐ, ์ด๋ฒˆ ๋ฌธ์ œ๋Š” ๋™์ ๊ณ„ํš๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์˜ณ์€ ๋ฐฉ์‹์ด์˜€์ง€๋งŒ ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์‚ฌ์šฉํ•ด์„œ ์„ฑ๋Šฅ์€ ๋–จ์–ด์ง€์ง€๋งŒ ๋‹ค์–‘ํ•œ ์ ‘๊ทผ๋ฒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ๋ฐ”๋ผ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋˜๊ฒƒ ๊ฐ™๋‹ค. ํŠนํžˆ, ํ‰์†Œ์— ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์ด์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ• ๋•Œ DP๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋„ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ๊ฐ€๋” ๋ณธ์  ์žˆ๋Š”๋ฐ ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด ๊ถ๊ธˆ์€ ํ–ˆ์ง€๋งŒ, ํฌ๊ฒŒ ํŒŒ๊ณ ๋“ค์ง€ ์•Š์•˜๋Š”๋ฐ

๋ฐฑํŠธ๋ž˜ํ‚น์€ ๊ฒ€์ƒ‰ ๋ฒ”์œ„๊ฐ€ ํฌ์ง€ ์•Š๊ฑฐ๋‚˜ ์กฐ๊ฑด์— ๋”ฐ๋ผ ํƒ์ƒ‰์„ ๋น ๋ฅด๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ๊ฑฐ๋‚˜, ๋ฌธ์ œ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉฐ ํ’€์–ด๊ฐ€๋Š” ๊ฒƒ์ด ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ฒฝ์šฐ ์ ํ•ฉํ•˜๊ณ ,

๋™์ ๊ณ„ํš๋ฒ•์€ ํ•˜์œ„ ๋ฌธ์ œ์˜ ๊ฒฐ๊ณผ๋ฅผ ์žฌํ™œ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋‚˜ ๋ฌธ์ œ ํฌ๊ธฐ๊ฐ€ ํฌ๋”๋ผ๋„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ์‹ ์ค‘ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ ํ•ฉํ•˜๋‹ค. ์ด ์ ์„ ์žŠ์ง€๋ง๊ณ  ๊ฐ๊ฐ์˜ ์ผ€์ด์Šค์— ๋งž๊ฒŒ ํšจ์œจ์ ์ธ ํ•ด๊ฒฐ๋ฒ•์„ ์ ์šฉํ•˜๋Š” ์—ฐ์Šต์„ ํ•ด์•ผ๊ฒ ๋‹ค.