Algorithm

[μ•Œκ³ λ¦¬μ¦˜] λ°±μ€€ 1904 01타일

Ama_grammer 2024. 12. 26. 19:38

πŸ“–λ¬Έμ œ

01타일

 

 

❓ꡬ상

νŒ¨ν„΄μ˜ 개수λ₯Ό νŒŒμ•…ν•˜λŠ” λ¬Έμ œλŠ” μž‘μ€ 규λͺ¨μ˜ νŒ¨ν„΄μ„ νŒŒμ•…ν•΄μ„œ ν•΄κ²°ν•˜κΈ° 쒋은 동적 ν”„λ‘œκ·Έλž˜λ°(Dynamic Programming)

κ³„νšλ²•μœΌλ‘œ ν’€κΈ° μ ν•©ν•œ λ¬Έμ œμ΄λ‹€.

일반적인 이진법이라면 N이 1μΌλ•Œ 0κ³Ό 1을 λ§Œλ“€ 수 있기 λ•Œλ¬Έμ— 2κ°€ λ‚˜μ™€μ•Όν•˜μ§€λ§Œ, 이 문제의 쑰건을 μ‚΄νŽ΄λ³΄λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

1. 이진법을 ꡬ성할 λ•Œ 1κ³Ό 00의 μ‘°ν•©μœΌλ‘œλ§Œ ꡬ성을 ν•΄μ•Όν•œλ‹€.
2. 0은 01 ν˜Ήμ€ 10 처럼 μ‚¬μš©ν•  수 μ—†κ³  0이 2κ°œκ°€ λΆ™μ–΄μžˆμ–΄μ•Όν•œλ‹€.

μ£Όμ–΄μ§„ N에 따라 ν‘œν˜„λ  수 μžˆλŠ” μ΄μ§„λ²•μ˜ μ’…λ₯˜λ₯Ό μ•Œμ•„λ³΄λ©΄ νŒ¨ν„΄μ„ νŒŒμ•…ν•  수 μžˆμ„κ²ƒμœΌλ‘œ κΈ°λŒ€λœλ‹€.

 

🎲 νŒ¨ν„΄

N이 1μΌλ•Œ λΆ€ν„° 7μΌλ•Œ κΉŒμ§€μ˜ νŒ¨ν„΄μ„ νŒŒμ•…ν•œ κ²°κ³Ό ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ²˜λŸΌ dp[i] = dp[i-1] + dp[i-2] 의 νŒ¨ν„΄μ„ κ°€μ§€κ³  μžˆμŒμ„ μ•Œ 수 μžˆλ‹€.

이 것을 λ°”νƒ•μœΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ³΄μž.

 

μ½”λ“œ.

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

 

 

 

πŸ”₯배운 점

이전에 올린 λ°±μ€€ 1003 ν”Όλ³΄λ‚˜μΉ˜ ν•¨μˆ˜ κΈ€μ—μ„œ "큰 문제λ₯Ό μž‘μ€ λ‹¨μœ„μ˜ 문제둜 λΆ„ν•΄ ν•˜μ—¬ νŒ¨ν„΄μ„ νŒŒμ•…ν•΄μ•Όν•˜λŠ” 점" 을 μžŠμ§€ μ•Šκ³  DP 문제λ₯Ό ν’€λ•Œ 염두해 λ‘μ—ˆλ”λ‹ˆμ–΄λŠμ •λ„ 동적 κ³„νšλ²•μ— μ΅μˆ™ν•΄μ‘Œλ‹€κ³  μƒκ°ν–ˆκ³ , μœ μ‚¬ν•œ ν˜•νƒœμ˜ DP λ¬Έμ œλŠ” μ–΄λŠμ •λ„ ν’€ 수 있게 λœκ²ƒ κ°™λ‹€. ν•˜μ§€λ§Œ, λ‹€λ₯Έ νŒ¨ν„΄μœΌλ‘œ DP κ³„νšλ²•μ„ μ‚¬μš©ν•˜λŠ” κ²½μš°λŠ” μ—¬μ „νžˆ 문제λ₯Ό ν•΄κ²°ν•˜λŠ”λ° 어렀움이 μžˆλ‹€. λ‹¨μˆœνžˆ ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄μ˜ ν”„λ ˆμž„μ„ κ°–λŠ” DP 이외에 해결법에 λŒ€ν•œ ν•™μŠ΅μ΄ μΆ”κ°€λ‘œ ν•„μš”ν•œ 것 κ°™λ‹€.