Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋ฐฑ์ค€ 1003 ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜

Ama_grammer 2024. 12. 12. 23:51

๐Ÿ“–๋ฌธ์ œ

1003 ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜

 

 

โ“๊ตฌ์ƒ

ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Dynamic Programming) ๊ณ„ํš๋ฒ•์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ด๋‹ค.

์šฐ์„  ๋ฌธ์ œ๋ฅผ ๋ณด๋‹ˆ N๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” C++ ํ•จ์ˆ˜์˜ ์˜ˆ์ œ๊ฐ€ ๋‚˜์™€์žˆ๋‹ค.

์ผ๋‹จ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๊ณ  fibonacci(n) ์—์„œ n์ด 0๊ณผ 1์ธ ๊ฒฝ์šฐ๋ฅผ ์นด์šดํŒ…ํ•˜๋ฉด ๋ฌธ์ œ์—์„œ ์š”๊ตฌํ•˜๋Š” ์ถœ๋ ฅ์„ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ ๋œ๋‹ค.

ํ•œ๋ฒˆ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

 

์‹œ๋„ํ•œ ์ฝ”๋“œ.

const [T, ...arr] = require("fs").readFileSync("/dev/stdin", "utf-8").trim().split("\n").map(Number);
const result = new Array(T);
let line = [0, 0];
const fibo = (n) => {
  if (n === 0) {
    line[0] += 1;
    return 0;
  }
  if (n === 1) {
    line[1] += 1;
    return 1;
  }
  return fibo(n - 1) + fibo(n - 2);
};
arr.forEach((e, i) => {
  fibo(e);
  result[i] = line.join(" ");
  line = [0, 0];
});
console.log(result.join("\n"));

 

์žฌ๊ท€ ํ•จ์ˆ˜

1. ๋ชจ๋“  ๋ฐฐ์—ด ์ˆœํšŒ
2. element ๋ฅผ fibo ํ•จ์ˆ˜์— ์ธ์ž๋กœ ๋„˜๊ฒจ์ค€๋‹ค.
3. ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด fibo ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ 0๊ณผ 1์ด ์ „๋‹ฌ ๋˜๋Š” ๊ฒƒ์„ ์นด์šดํŒ… ํ•œ๋‹ค.

 

์ฒ˜์Œ์—๋Š” ๋ณ„ ์˜์‹ฌ ์—†์ด ๋ฌธ์ œ์—์„œ ์ œ๊ณต๋œ ํ•จ์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์‹œ๋„ํ•ด๋ณด์•˜๋‹ค.

์šฐ์„  ๋™์ž‘์„ ํ•ด๋ณด๋ฉด ๊ธฐ๋ณธ ์˜ˆ์ œ ์ž…๋ ฅ์— ๋Œ€ํ•œ ์ถœ๋ ฅ์€ ๋ฌธ์ œ ์—†์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๊ณ  ์ด ๊ฒƒ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•ด๋ณด์•˜๋‹ค.

 

๊ฒฐ๊ณผ๋Š”.

 

์ถœ๋ ฅ์—๋Š” ์ „ํ˜€ ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ ์ด ์ฝ”๋“œ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋ถ„์„ํ•ด๋ณด๋ฉด

 

1. fibo ํ•จ์ˆ˜์˜ ๋™์ž‘

  • fibo ํ•จ์ˆ˜๋Š” ์žฌ๊ท€์ ์œผ๋กœ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
  • ์žฌ๊ท€ ํ˜ธ์ถœ์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ด๋ฃจ์–ด์ง„๋‹ค.
    • fibo(n) ์€ fibo(n-1) ๊ณผ fibo(n-2) ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    • ํ˜ธ์ถœ ํŠธ๋ฆฌ๋Š” ์ด์ง„ ํŠธ๋ฆฌ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋ฉฐ, ํŠธ๋ฆฌ์˜ ๊นŠ์ด๋Š” n ์ด๋‹ค.
  • ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ ๊ฐœ์ˆ˜๋Š” 2^n ์— ๋น„๋ก€ํ•˜๋ฏ€๋กœ, ์žฌ๊ท€ ํ˜ธ์ถœ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(2^n) ์ด๋‹ค.

2. ์ „์ฒด ์ฝ”๋“œ์˜ ๋™์ž‘

  • ์ž…๋ ฅ T : ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜
  • ์ž…๋ ฅ ๋ฐฐ์—ด arr : ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค n ๊ฐ’์ด ์ €์žฅ๋œ ๋ฐฐ์—ด
  • ์นต ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค e ์— ๋Œ€ํ•ด fibo(e) ๋ฅผ ํ˜ธ์ถœ
    • ๊ฐ๊ฐ์˜ fibo(e) ํ˜ธ์ถœ์€ O(2^n) ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–์Œ.

3. ์ตœ์ข… ์‹œ๊ฐ„ ๋ณต์žก๋„

๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(T*2^n) ์„ ๊ฐ–๋Š”๋‹ค.

 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— n ์ด ์ž‘์€ ์ˆ˜์ธ ๊ฒฝ์šฐ ํฐ ๋ฌธ์ œ๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด ๋ฌธ์ œ๋Š” N ์ด 40๋ณด๋‹ค ์ž‘๊ณ  0๋ณด๋‹ค ํฐ ์ˆ˜ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ œ์•ฝ ์กฐ๊ฑด์ธ 0.25 ์ดˆ ๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๊ฒŒ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋Š” ๋‹จ์ˆœ ์žฌ๊ท€๋กœ ํ‘ธ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณ„ํš๋ฒ•์„ ํ™œ์šฉํ•ด ํ‘ธ๋Š” ๊ฒƒ์ด ์˜ณ๋ฐ”๋ฅธ ๊ฒƒ์ด๋‹ค.

์ฝ”๋“œ.

const [T, ...arr] = require("fs")
  .readFileSync("/dev/stdin", "utf-8")
  .trim()
  .split("\n")
  .map(Number);
const result = [];
const fibo = (N) => {
  let dp = [];
  for (let i = 0; i <= N; i++) {
    if (i === 0) dp[i] = [1, 0];
    else if (i === 1) dp[i] = [0, 1];
    else dp[i] = [dp[i - 1][0] + dp[i - 2][0], dp[i - 1][1] + dp[i - 2][1]];
  }
  return dp[N].join(" ");
};
arr.forEach((e) => result.push(fibo(e)));
console.log(result.join("\n"));

 

๋™์  ๊ณ„ํš๋ฒ•

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

์ฒ˜์Œ์—๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์ฒ˜์Œ์— ์‹œ๋„ํ•œ ์ฝ”๋“œ์˜ ํ•จ์ˆ˜๋ถ€๋ถ„์„ ํ•˜ํ–ฅ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๊ฐœ์„ ๋˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ๋‹จ์ˆœํžˆ ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜์— ํ•˜ํ–ฅ์‹์„ ์ ์šฉํ•˜๋ฉด ์ค‘๋ณต ๊ณ„์‚ฐ์„ ์ตœ๋Œ€ํ•œ ์ค„์ด๋Š” ๊ณผ์ •์†์— 0๊ณผ 1์˜ ์นด์šดํŒ…์€ ๋‹น์—ฐํžˆ ์ œ๋Œ€๋กœ ๋  ์ˆ˜ ์—†์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ฒฐ๊ณผ ๊ฐ’์˜ ํŒจํ„ด์— ์ง‘์ค‘ํ•ด ๋ณด์•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ

n = 0 : [0๊ฐฏ์ˆ˜, 1๊ฐฏ์ˆ˜] = [1, 0]
n = 1  : [0๊ฐฏ์ˆ˜, 1๊ฐฏ์ˆ˜] = [0, 1]
n = 2  : [0๊ฐฏ์ˆ˜, 1๊ฐฏ์ˆ˜] = [1, 1]
n = 3  : [0๊ฐฏ์ˆ˜, 1๊ฐฏ์ˆ˜] = [1, 2]
.
.

 

0์˜ ๊ฐฏ์ˆ˜์™€ 1์˜ ๊ฐฏ์ˆ˜๊ฐ€ n-1 ์˜ 0, 1 ๊ฐฏ์ˆ˜์™€ n-2 ์˜ 0, 1 ๊ฐฏ์ˆ˜์˜ ํ•ฉ๊ณผ ๊ฐ™์Œ์„ ์•Œ์•˜๋‹ค.

๊ทธ๋ ‡๊ธฐ์— n ์ด 0 ์ธ ๊ฒฝ์šฐ์™€ 1 ์ธ๊ฒฝ์šฐ์˜ ๊ฐ’์„ dp ๋ฐฐ์—ด์— ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์‹œํ‚ค๊ณ  ๊ทธ ๊ฐ’์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ฐ’์„ ๊ตฌํ•ด๋‚˜๊ฐ€๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

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

์‹ค๋ฒ„3 ๋“ฑ๊ธ‰์˜ ๋ฌธ์ œ๋ผ ๋‹น์—ฐํžˆ ๋ฌธ์ œ์—์„œ ์ œ๊ณต๋œ ํ•จ์ˆ˜๋กœ ํ’€๋ฆฌ์ง€ ์•Š์„ ๊ฒƒ์„ ์•Œ์•˜์ง€๋งŒ, ๋‹จ์ˆœํžˆ ๊ทธ ํ•จ์ˆ˜๋ฅผ ํƒ€๋ทธ๋ ˆ์ด์…˜์—์„œ ํ•˜ํ–ฅ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•ด์„œ ํ’€๋ ค ํ•˜๋‹ค๋ณด๋‹ˆ ๊ณ ์ •๊ด€๋…์— ํœฉ์‹ธ์ธ๊ฑฐ ๊ฐ™๋‹ค.

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