notion-031

๐Ÿ˜‰ ํ—ท๊ฐˆ๋ ธ๋˜ & ๋ชฐ๋ž๋˜ ๋ถ€๋ถ„๋“ค๋งŒ ์ •๋ฆฌํ•˜๋Š” ๋‚˜๋งŒ์˜ TIL
๐Ÿ˜ฏ ๋ชจ๋“  ๊ฐ•์˜ ๋‚ด์šฉ์€ ์ ์ง€ ์•Š์•„์š”!

์˜ค๋Š˜์˜ ์†Œ๊ฐ์€?
์ง„์งœ ๋‹จ์–ด ์กฐ๊ฐ ๋ฌธ์ œ ํ’€๋‹ค๊ฐ€ ์ฐ”๋” ์šธ ๋ป” ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ €๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์œ ํ˜• ์ค‘์— ๊ทธ๋ฆฌ๋””์™€ DP๊ฐ€ ๊ฐ€์žฅ ์–ด๋ ต๋‹จ ๋ง์ด์—์š”!

๋ฐฑํŠธ๋ž˜ํ‚น, BFS, DFS๋งŒ ํ’€์ง€ ๋ง๊ณ , ์ทจ์•ฝํ•œ ๋ถ€๋ถ„ ์œ„์ฃผ๋กœ ์—ฐ์Šตํ•ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค.




[1] ๋ฐฑํŠธ๋ž˜ํ‚น

  • ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.
  • DFS๋‚˜ BFS๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํšจ์œจ์„ ์œ„ํ•ด ํƒ์ƒ‰ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ณณ์„ ๋ฏธ๋ฆฌ ๋ง‰๋Š” ๊ฒƒ์„ ๊ฐ€์ง€์น˜๊ธฐ(Pruning)์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค.
  • JS๋Š” ์žฌ๊ท€ ํšจ์œจ์ด ๋‚˜๋น  DFS๋ฅผ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ, ์Šคํƒ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
    ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์ด๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์žฌ๊ท€๋กœ ์ž‘์„ฑํ•ด๋„ ํ’€ ์ˆ˜ ์žˆ๋„๋ก ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํƒ์ƒ‰์—์„œ ์ˆœํ™˜(Cycle)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด BFS๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•ฉ๋‹ˆ๋‹ค.




[+] ์‹ค์Šต ์ฝ”๋“œ - N-Queen

๐Ÿ˜‚์˜คํƒ€ ํ•˜๋‚˜ ๋•Œ๋ฌธ์— 2์‹œ๊ฐ„ ๋‚ ๋ฆฐ N-Queen..
๋””๋ฒ„๊น…๋งŒ ํ•œ์‹œ๊ฐ„ ํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ i๋ฅผ 1๋กœ ์ž˜๋ชป ์ผ์—ˆ๋„ค์š” ํ•˜ํ•˜
>
ํ’€์ด ๋ฐฉ๋ฒ•์€ ์ฒด์ŠคํŒ ์ „์ฒด๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, row๋กœ๋งŒ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
> row์˜ ์ธ๋ฑ์Šค๋Š” ํ–‰, row์˜ ๊ฐ’์€ ์—ด๋กœ ๋‘๊ณ  ํ’€์ด๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
>
checkํ•จ์ˆ˜์—์„œ ์ธ๋ฑ์Šค๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ์— return false
ํ–‰, ์—ด์— ๋Œ€ํ•œ ์ฐจ๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ์— (๋Œ€๊ฐ์„ ์— ์œ„์น˜) return false๋กœ ๋ฐฑํŠธ๋ž˜ํ‚นํ•ด์ค๋‹ˆ๋‹ค.


function check(index, row) {
  for (let i = 0; i < index; i += 1) {
    if (row[index] === row[i]) {
      return false;
    }

    if (Math.abs(row[index] - row[i]) === index - i) {
      return false;
    }
  }
  return true;
}

function solution(n) {
  let count = 0;
  let row = new Array(n).fill(0);

  function dfs(index) {
    if (index === n) {
      count += 1;
      return;
    }

    for (let i = 0; i < n; i += 1) {
      row[index] = i;
      if (index === 0 || (index > 0 && check(index, row))) {
        dfs(index + 1);
      }
    }
  }

  dfs(0);
  return count;
}




[2] ๋™์  ๊ณ„ํš๋ฒ•(Dynamic Programming)

  • ํ•ด๊ฒฐํ•œ ์ž‘์€ ๋ฌธ์ œ๋กœ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ ํ’€์ด ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๋””๋‚˜ ๋ฐฑํŠธ๋ž˜ํ‚น์ฒ˜๋Ÿผ ํŠน์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹Œ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ์‹์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ์ž๋ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•๋ก ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  1. ๋ฉ”๋ชจ์ด์ œ์ด์…˜ (Menoization)
  2. ํƒ€๋ทธ๋ ˆ์ด์…˜ (Tabulation)


[2-1] ๋ฉ”๋ชจ์ด์ œ์ด์…˜

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


[2-2] ํƒ€๋ทธ๋ ˆ์ด์…˜

  • ์ƒํ–ฅ์‹ ์ ‘๊ทผ๋ฒ•
  • ํ•„์š”ํ•œ ๊ฐ’๋“ค์„ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•ด๋‘๋Š” ๊ฒƒ


๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ํ•„์š”ํ•  ๋•Œ ๊ณ„์‚ฐํ•œ๋‹ค๋ฉด (Lazy evalution)
ํƒ€๋ทธ๋ ˆ์ด์…˜์€ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•ด๋‘ก๋‹ˆ๋‹ค. (Eager evaluation)
>
๋ณดํ†ต์˜ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.


[2-3] ์ ‘๊ทผ๋ฒ•

  • ๊ฐ€์žฅ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€
  • ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ทœ์น™์ด ์žˆ๋Š”์ง€

์œ„ ๋‘ ๊ฐ€์ง€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋™์  ๊ณ„ํš๋ฒ• ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๊ฐ„ํ˜น ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋„ˆ๋ฌด ์‚ฌ์šฉํ•˜์—ฌ ํ†ต๊ณผ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์ƒ๊ธฐ์ง€๋งŒ, ์ด๋Ÿฐ ๊ฒฝ์šฐ์—” ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.




[+] ์‹ค์Šต ์ฝ”๋“œ - ๋‹จ์–ด ์กฐ๊ฐ

๐Ÿ˜ฅ ํ’€๋‹ค๊ฐ€ ์šธ๋ป”ํ–ˆ์Šต๋‹ˆ๋‹ค.
>
๋ชจ๋“  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ์œ ํ˜• ์ค‘ ๊ทธ๋ฆฌ๋””์™€ dp๋ฅผ ์ œ์ผ ์–ด๋ ค์›Œํ•˜๋Š” ์ €์—๊ฒŒ ๋‹จ์–ด ์กฐ๊ฐ ๋ฌธ์ œ๋Š” ์ •๋ง ํž˜๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
>
> ์›๋ฆฌ)

  1. ๋‹จ์–ด๋ฅผ ๋ฌธ์ž์—ด์—์„œ ์ž˜๋ผ์„œ ๋‹จ์–ด ์กฐ๊ฐ์— ์žˆ๋Š”์ง€ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
  2. ์žˆ์œผ๋ฉด ํ•ด๋‹น ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜๋กœ dp[๋‹จ์–ด ๋์ž๋ฆฌ idx + 1]๋ฅผ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ทธ ๋‹ค์Œ ๋‹จ์–ด๋ถ€ํ„ฐ๋Š” ๋‹จ์–ด ์กฐ๊ฐ์— ์žˆ์„ ์‹œ, dp[๋‹จ์–ด ์ฒซ์ž๋ฆฌ]+1๊ณผ dp[๋‹จ์–ด ๋์ž๋ฆฌ idx + 1]๋ฅผ ๋น„๊ตํ•ด
    ์ตœ์†Œ ๊ฐ’์„ dp[๋‹จ์–ด ๋์ž๋ฆฌ idx + 1]์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  4. ๋งค๋ฒˆ dp[๋‹จ์–ด ๋์ž๋ฆฌ idx + 1]๋Š” 20000(์ตœ๋Œ€๊ฐ’)์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—,
    ๋งŒ์•ฝ ๋ฐ˜๋ณต๋ฌธ์ด ๋๋‚œ ํ›„ dp[์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด]์˜ ๊ฐ’์ด 20000๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ํฌ๋ฉด ๋‹จ์–ด ์กฐ๊ฐ๋“ค๋กœ ํ•ด๋‹น ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์—†์Œ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.


    ์˜ˆ์‹œ) banana / [ba, na, n, a]

    1. b๋ถ€ํ„ฐ ๋‹จ์–ด ์กฐ๊ฐ์— ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
    โ†’ ์—†์œผ๋‹ˆ dp[1]์—๋Š” 20000์ด ๊ทธ๋Œ€๋กœ ์ €์žฅ (dp[๋‹จ์–ด ๋์ž๋ฆฌ idx] + 1)

    2. a๋กœ ๋๋‚˜๋Š” ๋‹จ์–ด์ธ ba, a๋ฅผ ๋‹จ์–ด ์กฐ๊ฐ์— ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
    โ†’ a๊ฐ€ ์žˆ์œผ๋‹ˆ dp[2] ๊ฐ’์€ dp[1] + 1 ๊ฐ’ (20001)๊ณผ dp[2] (20000) ์ค‘ ์ตœ์†Œ๊ฐ’ ์ €์žฅ = 20000
    โ†’ ba๊ฐ€ ์žˆ์œผ๋‹ˆ dp[2] ๊ฐ’์€ dp[0] + 1๊ฐ’ (1)๊ณผ dp[2] (20000) ์ค‘ ์ตœ์†Œ๊ฐ’ ์ €์žฅ = 1

    3. n์œผ๋กœ ๋๋‚˜๋Š” ๋‹จ์–ด์ธ n, an, ban์„ ๋‹จ์–ด ์กฐ๊ฐ์— ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
    โ†’ n์ด ์žˆ์œผ๋‹ˆ dp[3] ๊ฐ’์€ dp[2] + 1 ๊ฐ’ (2)๊ณผ dp[3] (20000) ์ค‘ ์ตœ์†Œ๊ฐ’ ์ €์žฅ = 2
    โ†’ an๊ณผ ban์€ ์—†์Œ

    4. a๋กœ ๋๋‚˜๋Š” ๋‹จ์–ด์ธ a, na, ana, bana๋ฅผ ๋‹จ์–ด ์กฐ๊ฐ์— ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
    โ†’ a๊ฐ€ ์žˆ์œผ๋‹ˆ dp[4] ๊ฐ’์€ dp[3] + 1 ๊ฐ’(3)๊ณผ dp[4] (20000) ์ค‘ ์ตœ์†Œ๊ฐ’ ์ €์žฅ = 3
    โ†’ na๊ฐ€ ์žˆ์œผ๋‹ˆ dp[4] ๊ฐ’์€ dp[2] + 1๊ฐ’ (2)๊ณผ dp[4] (3) ์ค‘ ์ตœ์†Œ๊ฐ’ ์ €์žฅ = 2
    โ†’ ana, bana ์—†์Œ

    โ€ฆ

    ํ•ด๋‹น ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋‹ค๋ณด๋ฉด dp์˜ ๋งจ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์— ์ตœ์†Œ ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ˜Š


// ๋ฉ”๋ชจ์ด์ œ์ด์…˜
// ๊ฐ ๋‹จ์–ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ๊ฐฏ์ˆ˜์˜ ๋‹จ์–ด๋ฅผ ์ €์žฅํ•ด๋†“๋Š”๋‹ค.
// ๋‹ค์Œ ๋‹จ์–ด๊ฐ€ ๋“ค์–ด์™”์„ ๋•Œ, ์ €์žฅํ•œ ๋‹จ์–ด + ๋‹ค์Œ ์ตœ์†Œ ๊ฐฏ์ˆ˜ ๋‹จ์–ด
// ๋งŒ์•ฝ ์ตœ์†Œ๊ฐ’์ด ๊ฐฑ์‹ ๋˜๋ฉด ๋ฉ”๋ชจํ•ด๋†“์€ ๋‹จ์–ด์˜ ์ˆ˜๋„ ๊ฐฑ์‹ 

function solution(strs, t) {
  let tLen = t.length;
  let dp = new Array(tLen + 1).fill(0);
  let answer = 0;

  // k์˜ ๋ฒ”์œ„๋„ 1, 6์œผ๋กœ ์ง€์ •ํ•ด์„œ i๋ฒ”์œ„๋„ ํŽธํ•˜๊ฒŒ 1, tLen + 1๋กœ ์ง€์ •
  // i๋Š” ์ž˜๋ผ์„œ ๋‹จ์–ด ์กฐ๊ฐ๋“ค๊ณผ ๋น„๊ตํ•  '์ž๋ฅธ ๋‹จ์–ด'์˜ ๋ ๊ธ€์ž
  for (let i = 1; i < tLen + 1; i += 1) {
    // ์ตœ์†Ÿ๊ฐ’ ๋น„๊ต๋ฅผ ์œ„ํ•ด 200000์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•ด์ค€๋‹ค.
    // ๋งŒ์•ฝ ํ•ด๋‹นํ•˜๋Š” ๋‹จ์–ด๊ฐ€ ๋‹จ์–ด ์กฐ๊ฐ์— ์—†์–ด์„œ ์กฐ๊ฑด๋ฌธ์— ๋“ค์–ด๊ฐ€์ง€ ์•Š์œผ๋ฉด
    // 200000์ด ์œ ์ง€๋˜๊ณ  dp[-1]์ด >= 200000์ด๋ฉด ํ•ด๋‹น ๋‹จ์–ด์กฐ๊ฐ๋“ค๋กœ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค์ง€ ๋ชปํ•œ๋‹ค๋Š” ๋œป.
    dp[i] = 200000;

    // ๋‹จ์–ด ์กฐ๊ฐ์˜ ๊ธธ์ด๋Š” 1์ด์ƒ 5 ์ดํ•˜
    for (let k = 1; k < 6; k += 1) {
      // s๋ถ€ํ„ฐ i ์‚ฌ์ด์˜ ๋ฌธ์ž์—ด์„ ์ž๋ฅผ๊ฒ๋‹ˆ๋‹ค.
      let s = i - k;

      // ์Œ์ˆ˜๋ฉด ๊ทธ๋ƒฅ ๋งจ ์ฒซ๋ฒˆ์งธ๋ถ€ํ„ฐ ์ž๋ฅด๋Š”๊ฑฐ๋ž‘ ๋‹ค๋ฅผ ๊ฒŒ ์—†๋‹ค.
      if (s < 0) s = 0;

      // s๋ถ€ํ„ฐ i ์ „๊นŒ์ง€ ์ž˜๋ผ์ค๋‹ˆ๋‹ค.
      tSplit = t.substring(s, i);

      // ๋‹จ์–ด ์กฐ๊ฐ ๋ชจ์Œ ๋ฐฐ์—ด์—์„œ ํ•ด๋‹น tSplit์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด dp ๋ฐฐ์—ด์—์„œ ์ตœ์†Ÿ๊ฐ’์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
      // dp๋ฐฐ์—ด[๋‹จ์–ด ๋์ž๋ฆฌ idx] = ์ตœ์†Œ๊ฐ’(dp[๋‹จ์–ด ๋์ž๋ฆฌ idx], dp[ํ•ด๋‹น ๋‹จ์–ด์˜ ์ฒซ์ž๋ฆฌ idx] + 1)
      // ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, ์ž๋ฅธ ๋‹จ์–ด๊ฐ€ ๋‹จ์–ด ์กฐ๊ฐ ๋ชจ์Œ์— ์žˆ์–ด์„œ ์ƒˆ๋กœ ๊ฐ’์ด ๊ฐฑ์‹ ๋  ์ˆ˜ ์žˆ๋Š”์ง€
      // ์•„๋‹ˆ๋ฉด ์ „์— ์ €์žฅ๋œ ๊ฐ’ + 1 (๋‹จ์–ด์˜ ๊ฐœ์ˆ˜ += 1)์ธ์ง€ ์ตœ์†Œ๋ฅผ ๊ตฌํ•œ๋‹ค.
      if (strs.includes(tSplit)) {
        dp[i] = Math.min(dp[i], dp[s] + 1);
      }
    }
  }

  if (dp[tLen] >= 200000) answer = -1;
  else answer = dp[tLen];

  return answer;
}

์ถœ์ฒ˜

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์นดํ…Œ๊ณ ๋ฆฌ: ,

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ