Computer Science๐Ÿงช/Data Structure, Algorithmโ›“๏ธ

๋ฏธ๋‹ˆ๋งฅ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์•ŒํŒŒ-๋ฒ ํƒ€ ๊ฐ€์ง€์น˜๊ธฐ

JanuDev 2025. 10. 13. 18:07

์ž‘๊ณ  ๊ท€์—ฌ์šด ๋จธ๋ฆฌ๋กœ ์˜ค๋ชฉ ๊ทœ์น™์ด๋ž‘ ๋กœ์ง ์ƒ๊ฐํ•˜๋‹ค๊ฐ€... 1์ฐจ๋กœ ์œ„์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ์ƒ๊ฐํ•ด์„œ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‹จ์ผ ๋‹จ๊ณ„ ํ‰๊ฐ€(1-Ply Evaluation)๋ผ๊ณ  ํ•œ๋‹ค.

์ด๊ฒƒ๋„ ์žฌ๋ฐŒ๊ธด ํ–ˆ๋Š”๋ฐ, ๋ฌธ์ œ๋Š” ์ปดํ“จํ„ฐ๊ฐ€ ๋‹ค์ฑ„๋กœ์šด ๋ฐฉ์‹์œผ๋กœ ๊ฒŒ์ž„์„ ํ•˜์ง„ ๋ชปํ–ˆ๋‹ค. ๋ฌด์Šจ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋ƒ๋ฉด..

  1. ๊ณต๊ฒฉ๊ณผ ๋ฐฉ์–ด๋ฅผ ์ ์ ˆํžˆ ์„ž์–ด์„œ ์ˆ˜๋ฅผ ๋‘ฌ์•ผ ํ•˜๋Š”๋ฐ ๊ทธ๋ ‡์ง€ ๋ชปํ•จ(๊ณต๊ฒฉ๋งŒ, ๋ฐฉ์–ด๋งŒ ์ฃผ๊ตฌ์žฅ์ฐฝ ํ•œ๋‹ค๋˜๊ฐ€)
  2. ์ƒ๋Œ€์˜ ๋Œ€์‘(์ฆ‰, ๋‚˜์˜ ๋Œ€์‘)์— ์˜ˆ์ธกํ•˜์ง€ ๋ชปํ•จ
  3. ๋Œ€๊ฐ์„ ์— ์•ฝํ•จ

์ด๋ ‡๋“ฏ ๋‹จ์ˆœํ•˜๊ฒŒ ๋กœ์ง์„ ์ž‘์„ฑํ•œ๋‹ค๋ฉด ์ƒ๋Œ€๊ฐ€ ๋‘˜ ๋ฏธ๋ž˜์˜ ์ˆ˜๋ฅผ ๋ณด์ง€ ๋ชปํ•˜๊ณ , ํ•จ์ •์— ์†์ˆ˜๋ฌด์ฑ…์ด๋ผ๊ณ  ํ•œ๋‹ค. 

๊ทธ๋ž˜์„œ ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด 2-ply ์ด์ƒ ํƒ์ƒ‰, ์ฆ‰ ๋ฏธ๋‹ˆ๋งฅ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ™•์žฅํ•ด์„œ ์ž‘์„ฑํ–ˆ๋‹ค.

๋กœ์ง์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„  ์šฐ์„  ๋ฏธ๋‹ˆ๋งฅ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์•Œ์•„์•ผ ํ–ˆ๋‹ค..


๋ฏธ๋‹ˆ๋งฅ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜(Minimax Algorithm)

๋‚˜๋Š” ์ตœ์„ ์„ ๋‹คํ•˜๊ณ , ์ƒ๋Œ€๋„ ์ตœ์„ ์„ ๋‹คํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, ์ตœ์ข…์ ์œผ๋กœ ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์œ ๋ฆฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ž˜ ์ด๊ธฐ๊ฒŒ ๋‘๊ณ , ์ƒ๋Œ€๋Š” ๋‚˜๋ฅผ ๊ฐ€์žฅ ๋ชป์ด๊ธฐ๊ฒŒ ๋‘”๋‹ค๋Š” ๊ฐ€์ •์œผ๋กœ ๊ฐ€๋Šฅํ•œ ์ˆ˜๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ด์„œ ์ตœ์„ ์„ ์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค. 

์ €๋Ÿฐ์‹์œผ๋กœ ์ปดํ“จํ„ฐ - ์‚ฌ๋žŒ ํ”Œ๋ ˆ์ด์–ด ๊ฐ„ ์ตœ์„ ์˜ ์ˆ˜๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉด์„œ ์‹คํ–‰ํ•œ๋‹ค.

 

miniMax()ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„

๋‘๋ช…์˜ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์™„๋ฒฝํžˆ ํ”Œ๋ ˆ์ดํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ—€์„ ๋•Œ, ์ง€๊ธˆ ์–ด๋–ค ์ˆ˜๋ฅผ ๋‘๋ฉด ๊ฐ€์žฅ ์œ ๋ฆฌํ• ์ง€ ๊ณ„์‚ฐํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

  • Max(์šฐ๋ฆฌ ์ฐจ๋ก€) : ์ ์ˆ˜๋ฅผ ์ตœ๋Œ€ํ•œ ๋†’์ด๋ ค๋Š” ํ”Œ๋ ˆ์ด์–ด
  • Min(์ƒ๋Œ€ ์ฐจ๋ก€) : ์ ์ˆ˜๋ฅผ ์ตœ๋Œ€ํ•œ ๋‚ฎ์ถ”๋ ค๋Š” ํ”Œ๋ ˆ์ด์–ด

๊ทธ๋ž˜์„œ miniMax()ํ•จ์ˆ˜๋Š” ๋‘๊ฐ€์ง€์˜ ์ผ์„ ๋ฒˆ๊ฐˆ์•„ ๊ฐ€๋ฉด์„œ ํ•˜๊ฒŒ ๋œ๋‹ค.

  • ์šฐ๋ฆฌ ์ฐจ๋ก€๋ผ๋ฉด : ๊ฐ€์žฅ ๋†’์€ ์ ์ˆ˜๋ฅผ ์„ ํƒ(์ด๊ธฐ๊ธฐ ์œ„ํ•ด)
  • ์ƒ๋Œ€ ์ฐจ๋ก€๋ผ๋ฉด : ๊ฐ€์žฅ ๋‚ฎ์€ ์ ์ˆ˜๋ฅผ ์„ ํƒ(์šฐ๋ฆฌ๋ฅผ ๋ถˆ๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด)

Ex : ํ‹ฑํƒํ†  ๊ฒŒ์ž„

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ ํƒ์ง€๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๊ณ  ํ•˜์ž.

A : ์ด๊ธฐ๋Š” ์ˆ˜ : ์ ์ˆ˜ +10

B : ๋น„๊ธฐ๋Š” ์ˆ˜ : ์ ์ˆ˜ 0

C : ์ง€๋Š” ์ˆ˜ : ์ ์ˆ˜ - 10

 

์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ miniMax()๋Š” 

๋‚ด๊ฐ€ ์ง€๊ธˆ ๋‘” ๋‹ค์Œ, ์ƒ๋Œ€๋„ ์ตœ์„ ์„ ๋‹คํ• ๊ฑฐ์•ผ. ๊ทธ๋Ÿผ ๊ฐ ๊ฒฝ์šฐ๋งˆ๋‹ค ๊ฒฐ๊ณผ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

 

๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋œ๋‹ค. 

 

๊ตฌ์„ฑ

miniMax(board, depth, isMaximizing)
  1. board : ํ˜„์žฌ ๊ฒŒ์ž„ ์ƒํƒœ
  2. depth : ์–ผ๋งˆ๋‚˜ ๊นŠ์ด ๊ณ„์‚ฐํ• ์ง€(๋ฏธ๋ž˜ ์ˆ˜์˜ ๋‹จ๊ณ„)
  3. isMaximizing : ์ง€๊ธˆ "์šฐ๋ฆฌ ํ„ด"์ธ์ง€ "์ƒ๋Œ€ ํ„ด"์ธ์ง€

์ˆœ์„œ 

  1. ๊ธฐ์ € ์กฐ๊ฑด(Base Case) : ๊ฒŒ์ž„์ด ๋๋‚ฌ๋‹ค๋ฉด ๊ทธ ์ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ŠนํŒจ๊ฐ€ ์ •ํ•ด์ง€๊ฑด, ๋” ๋‘˜ ๊ณณ์ด ์—†์„ ๋•Œ๋ฅผ ์œ„ํ•œ ์ข…๋ฃŒ ์กฐ๊ฑด์„ ์ž‘์„ฑ
  2. ์žฌ๊ท€ ํ˜ธ์ถœ(Recursive Call) : ๊ฒŒ์ž„์ด ๋๋‚˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ˆ˜๋ฅผ ๋ณด๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ miniMax()๋กœ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์—ฌ ๊ณ„์‚ฐํ•œ๋‹ค.
  3. ์ตœ๋Œ“๊ฐ’/์ตœ์†Ÿ๊ฐ’ ์„ ํƒ : ์šฐ๋ฆฌ ํ„ด์ด๋ฉด "๊ฐ€์žฅ ํฐ ๊ฐ’", ์ƒ๋Œ€ ํ„ด์ด๋ฉด "๊ฐ€์žฅ ์ž‘์€ ๊ฐ’"์„ ์„ ํƒํ•œ๋‹ค.
function miniMax(board, depth, isMaximizing) {
  // 1๋‹จ๊ณ„: ์ข…๋ฃŒ ์กฐ๊ฑด (๊ธฐ์ € ์กฐ๊ฑด)
  if (depth === 0 || ๊ฒŒ์ž„์ด๋๋‚ฌ๋‹ค๋ฉด) {
    return ํ˜„์žฌ์ƒํƒœ์˜์ ์ˆ˜  // ํ‰๊ฐ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ
  }

  // 2๋‹จ๊ณ„: Max ํ”Œ๋ ˆ์ด์–ด ํ„ด
  if (isMaximizing) {
    let maxScore = -Infinity  // ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์œผ๋กœ ์‹œ์ž‘
    
    for (๊ฐ€๋Šฅํ•œ๋ชจ๋“ ์ˆ˜) {
      // ๊ฐ€์ƒ์œผ๋กœ ์ˆ˜๋ฅผ ๋‘ 
      ์ˆ˜๋ฅผ๋‘”๋‹ค(board, ์ˆ˜)
      
      // ์žฌ๊ท€: ์ƒ๋Œ€๋ฐฉ ํ„ด์œผ๋กœ ๋„˜๊น€
      let score = miniMax(board, depth - 1, false)
      
      // ์ˆ˜๋ฅผ ๋˜๋Œ๋ฆผ
      ์ˆ˜๋ฅผ์ทจ์†Œํ•œ๋‹ค(board, ์ˆ˜)
      
      // ์ตœ๋Œ“๊ฐ’ ๊ฐฑ์‹ 
      maxScore = Math.max(maxScore, score)
    }
    
    return maxScore
  }
  
  // 3๋‹จ๊ณ„: Min ํ”Œ๋ ˆ์ด์–ด ํ„ด
  else {
    let minScore = Infinity  // ๊ฐ€์žฅ ํฐ ๊ฐ’์œผ๋กœ ์‹œ์ž‘
    
    for (๊ฐ€๋Šฅํ•œ๋ชจ๋“ ์ˆ˜) {
      // ๊ฐ€์ƒ์œผ๋กœ ์ˆ˜๋ฅผ ๋‘ 
      ์ˆ˜๋ฅผ๋‘”๋‹ค(board, ์ˆ˜)
      
      // ์žฌ๊ท€: ์ƒ๋Œ€๋ฐฉ ํ„ด์œผ๋กœ ๋„˜๊น€
      let score = miniMax(board, depth - 1, true)
      
      // ์ˆ˜๋ฅผ ๋˜๋Œ๋ฆผ
      ์ˆ˜๋ฅผ์ทจ์†Œํ•œ๋‹ค(board, ์ˆ˜)
      
      // ์ตœ์†Ÿ๊ฐ’ ๊ฐฑ์‹ 
      minScore = Math.min(minScore, score)
    }
    
    return minScore
  }
}

 

 

์ตœ๋Œ€ํ•œ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ๋” ์ž‘์„ฑ์€ ํ–ˆ๋Š”๋ฐ... ํ•œ๊ณ„๊ฐ€ ์žˆ์–ด์„œ AI์—๊ฒŒ ๋ณด์ถฉ ์„ค๋ช…์„ ๋ถ€ํƒํ–ˆ๋‹ค. 

 

โžก๏ธ ์ˆ˜๋ฅผ ์ทจ์†Œํ•˜๋Š” ์ด์œ ?

๋”๋ณด๊ธฐ

๋ฏธ๋‹ˆ๋งฅ์Šค๋Š” "๋งŒ์•ฝ ์ด๋ ‡๊ฒŒ ๋‘๋ฉด ์–ด๋–จ๊นŒ?"๋ผ๊ณ  ๋ฏธ๋ฆฌ ์˜ˆ์ธกํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—

๊ฐ€์ƒ์œผ๋กœ ๋‘๊ณ 

์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  →

๋‹ค์‹œ ๋Œ์„ ์—†์•ค๋‹ค.

 

์˜ฌ๋ฐ”๋ฅธ ์ง„ํ–‰ ์˜ˆ์‹œ

ํ˜„์žฌ ๋ณด๋“œ:
โšซ โšช  _   _   _
 _     _   _   _   _
 _     _   _   _   _

๋ผ๊ณ  ๋’€๋‹ค ์ณค์„ ๋•Œ

 

0. ํ˜„์žฌ ์ƒํƒœ
board[0][2] = null  // ๋นˆ์นธ

// 1. ์ˆ˜๋ฅผ๋‘”๋‹ค(board, {x:0, y:2})
board[0][2] = 'โšซ'  // ๊ฐ€์ƒ์œผ๋กœ ๊ฒ€์€๋Œ ๋‘๊ธฐ
โšซ โšช โšซ _ _  // ์ด๋ ‡๊ฒŒ ๋จ
 _     _    _  _ _
 _     _    _  _ _

2. ์ด ์ƒํƒœ๋กœ ์žฌ๊ท€ ํ˜ธ์ถœ
let score = miniMax(board, ...)  // ์ด ์ƒํƒœ์—์„œ์˜ ์ ์ˆ˜ ๊ณ„์‚ฐ → ๋‹ค์‹œ ํ˜ธ์ถœํ•ด์„œ ์ƒ๋Œ€ ํ„ด์œผ๋กœ ๋„˜๊น€

3. ์ˆ˜๋ฅผ์ทจ์†Œํ•œ๋‹ค(board, {x:0, y:2})
board[0][2] = null  // ๋‹ค์‹œ ์›๋ž˜๋Œ€๋กœ
โšซ โšช _ _ _  // ์›์ƒ๋ณต๊ตฌ!
 _    _   _ _ _
 _    _   _ _ _

๋‹ค์Œ ์นธ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ณ„์†...


โŒ ์ทจ์†Œ ์•ˆ ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

1. 1๋ฒˆ์งธ ๋ฐ˜๋ณต - A์นธ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

board[0][2] = 'โšซ'  // A์นธ์— ๋‘ 

๋ณด๋“œ ์ƒํƒœ:
โšซ โšช โšซ _ _  <- A์นธ์— ๋Œ ์ƒ๊น€

scoreA = miniMax(board, ...)  // ์ด ์ƒํƒœ๋กœ ์ ์ˆ˜ ๊ณ„์‚ฐ

 

2. 2๋ฒˆ์งธ ๋ฐ˜๋ณต - B์นธ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

board[0][3] = 'โšซ'  // B์นธ์— ๋‘ 

 

์˜ˆ์ƒํ–ˆ๋˜ ๋ณด๋“œ ์ƒํƒœ :

'โšซ' โšซ โšช _ โšซ _ <- A์นธ์€ ์—†๊ณ  B์นธ๋งŒ ์žˆ์Œ! โœ…


ํ˜„์‹ค ๋ณด๋“œ ์ƒํƒœ:
โšซ โšช โšซ โšซ _  <- A์นธ ๋Œ์ด ์•„์ง ์žˆ์Œ! + B์นธ ๋Œ ์ถ”๊ฐ€๋จ!

scoreB = miniMax(board, ...)  // ์ž˜๋ชป๋œ ์ƒํƒœ๋กœ ์ ์ˆ˜ ๊ณ„์‚ฐ!

 

3. 3๋ฒˆ์งธ ๋ฐ˜๋ณต - C์นธ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

board[1][0] = 'โšซ'  // C์นธ์— ๋‘ 

 

์˜ˆ์ƒํ–ˆ๋˜ ๋ณด๋“œ ์ƒํƒœ :

'โšซ' โšซ โšช _ _ _ <- A์นธ, B์นธ์€ ์—†๊ณ 

โšซ _ _ _ _ <- C์นธ๋งŒ ์žˆ์Œ! โœ…


ํ˜„์‹ค ๋ณด๋“œ ์ƒํƒœ:
โšซ โšช โšซ โšซ _  <- A์นธ, B์นธ ๋Œ์ด ๋ชจ๋‘ ๋‚จ์•„์žˆ์Œ!
โšซ _ _ _ _  <- C์นธ ๋Œ ์ถ”๊ฐ€๋จ!

scoreC = miniMax(board, ...)  // ์™„์ „ํžˆ ์ž˜๋ชป๋œ ์ƒํƒœ!

 

์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ 

 

"A์นธ ํ•˜๋‚˜๋งŒ ๋’€์„ ๋•Œ" ์ ์ˆ˜๋Š”?
"B์นธ ํ•˜๋‚˜๋งŒ ๋’€์„ ๋•Œ" ์ ์ˆ˜๋Š”?
"C์นธ ํ•˜๋‚˜๋งŒ ๋’€์„ ๋•Œ" ์ ์ˆ˜๋Š”?

 

์ธ๋ฐ, ์‹ค์ œ๋กœ๋Š”

"A์นธ ํ•˜๋‚˜๋งŒ ๋’€์„ ๋•Œ" ์ ์ˆ˜๋Š”? โœ… ์ •ํ™•
"A+B ์นธ ๋‘˜ ๋‹ค ๋’€์„ ๋•Œ" ์ ์ˆ˜๋Š”? โŒ ์ž˜๋ชป๋จ!
"A+B+C ์นธ ์…‹ ๋‹ค ๋’€์„ ๋•Œ" ์ ์ˆ˜๋Š”? โŒ ์ž˜๋ชป๋จ!

 

๋”ฐ๋ผ์„œ ๋ฏธ๋‹ˆ๋งฅ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ ๋ฐ˜๋ณต(Iteration)๋งˆ๋‹ค ๋‹ค์Œ 2๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

  • ์ƒํƒœ ๋ณต์‚ฌ ํ›„ ๋ณ€๊ฒฝ (Deep Clone): ํƒ์ƒ‰์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๋ณด๋“œ๋ฅผ ๋งŒ๋“ค๊ณ (๋ณต์‚ฌ), ์—ฌ๊ธฐ์— ๋Œ์„ ๋‘ก๋‹ˆ๋‹ค. 
  • ์ƒํƒœ ๋ณ€๊ฒฝ ํ›„ ๋ณต๊ตฌ (Undo/Redo): ์›๋ณธ ๋ณด๋“œ์— ๋Œ์„ ๋‘์—ˆ๋‹ค๊ฐ€, ์žฌ๊ท€ ํ˜ธ์ถœ์ด ๋๋‚œ ํ›„ ๋ฐ˜๋“œ์‹œ ๋Œ์„ ๋‹ค์‹œ ๋นผ๋ƒ…๋‹ˆ๋‹ค. (๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ด ํšจ์œจ์ ์ธ ๋ฐฉ์‹)

โžก๏ธ ์ˆ˜๋ฅผ ์ทจ์†Œํ•˜๋Š” ๋ฐฉ๋ฒ•

๋”๋ณด๊ธฐ

ํ•ต์‹ฌ ๊ฐœ๋… — ์™œ ๋ฐ˜๋“œ์‹œ ์›์ƒ๋ณต๊ตฌํ•ด์•ผ ํ•˜๋‚˜?

๋ฏธ๋‹ˆ๋งฅ์Šค๋Š” “๊ฐ ํ›„๋ณด(์นธ) ๋ณ„๋กœ ๋…๋ฆฝ์ ์ธ ๊ฒฐ๊ณผ”๋ฅผ ์•Œ๊ธฐ ์œ„ํ•จ
๋”ฐ๋ผ์„œ ๊ฐ ํ›„๋ณด๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•  ๋•Œ ๋ณด๋“œ ์ƒํƒœ๋Š” ๊ทธ ํ›„๋ณด๋งŒ ๋ฐ˜์˜๋œ ์ƒํƒœ์—ฌ์•ผ ํ•œ๋‹ค.
๋Œ์„ ๋‘๊ณ  ์žฌ๊ท€ ๊ณ„์‚ฐํ•œ ๋’ค ๋Œ์„ ๋‹ค์‹œ ์ œ๊ฑฐํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ ํ›„๋ณด๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•  ๋•Œ ์ด์ „ ํ›„๋ณด์˜ ๋ณ€๊ฒฝ์ด ๋‚จ์•„ ์žˆ์–ด ๊ฒฐ๊ณผ๊ฐ€ ๋’ค์„ž์—ฌ ๋ฒ„๋ฆฐ๋‹ค.

์˜ˆ) A ์นธ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ›„ A๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š์œผ๋ฉด B ์‹œ๋ฎฌ๋ ˆ์ด์…˜์€ A+B๊ฐ€ ๋†“์ธ ์ƒํƒœ๋ฅผ ๋ณด๊ณ  ๊ณ„์‚ฐํ•œ๋‹ค → ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ.


๊ตฌํ˜„ ๋ฐฉ๋ฒ• — ๋‘ ๊ฐ€์ง€ ์ผ๋ฐ˜์  ํŒจํ„ด

๋ฐฉ๋ฒ• A — ๋ถˆ๋ณ€(immutable) ๋ฐฉ์‹: ๋งค ์‹œ๋ฎฌ๋ ˆ์ด์…˜๋งˆ๋‹ค ์ƒˆ ๋ฐฐ์—ด/๋ณด๋“œ๋ฅผ ๋งŒ๋“ค์–ด ์žฌ๊ท€์— ๋„˜๊ธด๋‹ค

 

์žฅ์ : ์ฝ”๋“œ๊ฐ€ ์•ˆ์ „ํ•˜๊ณ  ๋ฒ„๊ทธ๊ฐ€ ๋œ ๋‚จ. React ์Šคํƒ€์ผ๊ณผ๋„ ์–ด์šธ๋ฆผ.
๋‹จ์ : ๋ณต์‚ฌ ๋น„์šฉ(๋ฉ”๋ชจ๋ฆฌ·์†๋„)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ(ํŠนํžˆ ๊นŠ๊ฒŒ/๋งŽ์ด ๋ณต์‚ฌํ•˜๋ฉด).

// stones: {x,y,color}[] ํ˜•ํƒœ์ผ ๋•Œ 

for (const {x,y} of possibleMoves) { 
  const newStones = [...currentStones, { x, y, color: 'black' as const }]
  const val = miniMax(newStones, depth - 1, alpha, beta, false) // ๋น„๊ต/๊ฐฑ์‹ 
}

// ์ด ๋ฐฉ์‹์€ board๋‚˜ stone ์›๋ณธ์„ ์ ˆ๋Œ€ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ undo๊ฐ€ ํ•„์š” ์—†์Œ.

๋ฐฉ๋ฒ• B — ๊ฐ€๋ณ€(mutable) ๋ฐฉ์‹: ๋ณด๋“œ(2D ๋ฐฐ์—ด)๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜๊ณ  ์žฌ๊ท€ ๋๋‚œ ๋’ค ๋˜๋Œ๋ฆฌ๊ธฐ(undo)

 

์žฅ์ : ๋ฉ”๋ชจ๋ฆฌ/์†๋„ ํšจ์œจ์ด ๋†’์Œ(๋ณต์‚ฌ ๋น„์šฉ ์—†์Œ).
๋‹จ์ : ๋ฐ˜๋“œ์‹œ “๋˜๋Œ๋ฆฌ๊ธฐ”๋ฅผ ์ •ํ™•ํžˆ ํ•ด์•ผ ํ•˜๊ณ , ์‹ค์ˆ˜ํ•˜๋ฉด ์ด์ „ ์ƒํƒœ๊ฐ€ ์˜ค์—ผ๋จ.

 
// board: string | null[][] (2D ๋ฐฐ์—ด) ์ผ ๋•Œ 

function tryMoveAndEval(board, x, y, color, depth, alpha, beta, isMax) { 
  board[x][y] = color // 1) ๊ฐ€์ƒ์œผ๋กœ ๋‘๊ธฐ 
  const val = miniMax(board, depth - 1, alpha, beta, !isMax) // 2) ์žฌ๊ท€ 
  board[x][y] = null // 3) ๋ฐ˜๋“œ์‹œ ๋˜๋Œ๋ฆฌ๊ธฐ! 
  return val 
}

//์ด ํŒจํ„ด์ด “๋‘๊ณ  → ๊ณ„์‚ฐ → ์ทจ์†Œ”์™€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•œ๋‹ค.

์‹ค์ „ ํŒ 

  1. ์ ˆ๋Œ€ setStone ๊ฐ™์€ React ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฏธ๋‹ˆ๋งฅ์Šค ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœํ•˜์ง€ ๋ง ๊ฒƒ
    -> ์žฌ๊ท€ ์•ˆ์—์„œ๋Š” ๋กœ์ปฌ(์ž„์‹œ) ๋ณ€์ˆ˜๋‚˜ ๋ณต์‚ฌ๋ณธ/2D board๋ฅผ ์จ๋ผ. setState๋Š” ๋น„๋™๊ธฐ์ด๊ณ  UI์™€ ์„ž์ด๋ฉด ์—‰ํ‚ด
  2. ํ‚ค ํฌ๋งท์ด๋‚˜ Map/Set ์‚ฌ์šฉ ์‹œ ํฌ๋งท ํ†ต์ผ ("${x},${y}" ์ฒ˜๋Ÿผ). ํฌ๋งท ๋ถˆ์ผ์น˜๋Š” ์น˜๋ช…์  ๋ฒ„๊ทธ๋ฅผ ๋‚ณ์Œ.
  3. ์„ฑ๋Šฅ: ๋งŽ์ด ๋ณต์‚ฌํ•˜๋ฉด ๋А๋ ค์ง€๋‹ˆ ๊นŠ์ด์™€ ํ›„๋ณด ์ˆ˜(ex. ์˜ค๋ชฉ์—์„œ ์ˆ˜๋ฅผ ์ฐพ๋Š” ํ•จ์ˆ˜)๋ฅผ ์ ์ ˆํžˆ ์ œํ•œํ•˜๊ฑฐ๋‚˜, mutable + undo ๋ฐฉ์‹์œผ๋กœ ์ตœ์ ํ™”ํ•˜์ž.
  4. ๋””๋ฒ„๊น…:
    • ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์งํ›„ console.log๋กœ ๋ณด๋“œ ์ƒํƒœ ์ฐ์–ด๋ณด๊ณ , ์žฌ๊ท€ ๋ฐ˜ํ™˜ ํ›„ ๋™์ผํ•œ ์ƒํƒœ๋กœ ๋Œ์•„์™”๋Š”์ง€ ํ™•์ธํ•˜๋ผ.
    • ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅธ ๊ฐ’(๋ˆ„์ ๋œ ๋Œ)์ด ๋‚˜์˜ค๋ฉด “๋˜๋Œ๋ฆฌ๊ธฐ ๋ˆ„๋ฝ”๋ถ€ํ„ฐ ์ ๊ฒ€.

์–ธ์ œ mutable + undo๊ฐ€ ๋” ์ข‹์€๊ฐ€?

  • ํ›„๋ณด๊ฐ€ ๋งŽ๊ณ  ์žฌ๊ท€ ํ˜ธ์ถœ์ด ํญ๋ฐœํ•  ๋•Œ(์„ฑ๋Šฅ ์ œํ•œ์ด ์‹ฌํ•œ ์ƒํ™ฉ), ๋ณด๋“œ 2D ๋ฐฐ์—ด + ๊ฐ€๋ณ€/undo ๋ฐฉ์‹์ด ํ›จ์”ฌ ๋น ๋ฆ„.
  • ๊ตฌํ˜„์€ ์กฐ๊ธˆ ๋” ๊นŒ๋‹ค๋กญ์ง€๋งŒ, ๋Œ€๊ทœ๋ชจ ํƒ์ƒ‰(๊นŠ์ด 3~4 ์ด์ƒ)์—์„œ๋Š” ๊ถŒ์žฅ๋จ.

๊ฒฐ๋ก 

  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ (A) ๋ถˆ๋ณ€์œผ๋กœ ์ƒˆ ๋ณด๋“œ/๋ฐฐ์—ด ๋งŒ๋“ค์–ด ๋„˜๊ธฐ๊ธฐ ๋˜๋Š” (B) ๊ฐ€๋ณ€ ๋ณด๋“œ์— ๋‘๊ณ  ์žฌ๊ท€ ๋๋‚˜๋ฉด ๋˜๋Œ๋ฆฌ๊ธฐ.
  • React ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฏธ๋‹ˆ๋งฅ์Šค ๋‚ด๋ถ€์—์„  setState ์“ฐ์ง€ ๋ง๊ณ  ๋กœ์ปฌ ๋ณต์‚ฌ๋‚˜ mutable-undo๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ.

๊ทธ๋Ÿฐ๋ฐ ๋ฏธ๋‹ˆ๋งฅ์Šค๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ์ƒ๋žตํ•ด์•ผ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋œ๋‹ค.

๊ทธ๋Ÿด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ŒํŒŒ-๋ฒ ํƒ€ ๊ฐ€์ง€์น˜๊ธฐ์ด๋‹ค!

์•ŒํŒŒ - ๋ฒ ํƒ€ ๊ฐ€์ง€์น˜๊ธฐ(Alpha-beta pruning)

๋ฏธ๋‹ˆ๋งฅ์Šค์—์„œ ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ • ์ค‘ "์ด ๊ฒฝ๋กœ๋กœ๋Š” ์–ด์ฐจํ”ผ ์ตœ์„ ์— ๋ชป๋ฏธ์น˜๋‹ˆ๊นŒ ๊ณ„์‚ฐํ•˜์ง€ ๋ง์ž"๊ณ  ์“ธ๋ฐ ์—†๋Š” ๊ฐ€์ง€๋ฅผ ์ž˜๋ผ๋‚ด๋Š” ๊ธฐ์ˆ ์ด๋‹ค. 

์ปดํ“จํ„ฐ(Max) ํ„ด: "์ตœ์†Œ 10์ ์€ ๋ณด์žฅ๋ฐ›๊ณ  ์‹ถ์–ด!"
     |
     โ”œโ”€โ”€ ์ˆ˜A๋ฅผ ๋‘๋ฉด → ์‚ฌ๋žŒ์ด ๋ญ˜ ํ•ด๋„ ์ตœ์†Œ 10์ 
     |
     โ””โ”€โ”€ ์ˆ˜B๋ฅผ ์‚ดํŽด๋ณด๋Š” ์ค‘...
          โ””โ”€โ”€ ์‚ฌ๋žŒ์ด ์ฒซ ๋ฒˆ์งธ ์ˆ˜๋ฅผ ๋‘๋‹ˆ 5์ ์ด ๋‚˜์˜ด
              → "์•„, ์ˆ˜B๋Š” ์ตœ๋Œ€ 5์ ์ด๋„ค?"
              → "์ด๋ฏธ ์ˆ˜A๋กœ 10์  ๋ณด์žฅ๋ฐ›์•˜์œผ๋‹ˆ ์ˆ˜B๋Š” ๋ณผ ํ•„์š” ์—†์–ด!"
              โœ‚๏ธ ๊ฐ€์ง€์น˜๊ธฐ!

https://hello-kk.tistory.com/580

 

์•ŒํŒŒ๋ฒ ํƒ€ ๊ฐ€์ง€์น˜๊ธฐ Alpha-beta pruning ์„ค๋ช…

์•ŒํŒŒ๋ฒ ํƒ€ ๊ฐ€์ง€์น˜๊ธฐ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ฐพ์•„๋ณด๋ฉฐ ํ•™์Šตํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.๋Œ“๊ธ€ ๋‚ด์šฉ ๊ผญ ํ™•์ธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋ฆผ๊ณผ ๊ทธ๋ฆผ ํ•˜๋‹จ์— ์„ค๋ช…์„ ์ฐธ๊ณ ํ•˜์‹œ

hello-kk.tistory.com

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์›๋ฆฌ๋Š” ์‚ฌ์‹ค ๋‚ด ์„ค๋ช…๋ณด๋‹จ ์ด ๋ธ”๋กœ๊ทธ ์„ค๋ช…๊ธ€ ๋ณด๋Š”๊ฒŒ ์ดํ•ด๊ฐ€ ๋” ๋น ๋ฅด๋‹ค. 

๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ๊ถ๊ธˆํ–ˆ๋˜ ๊ฒƒ ์œ„์ฃผ๋กœ ์ •๋ฆฌํ•˜์˜€๋‹ค.

 

1๏ธโƒฃ ์™œ max๋Š” -∞์—์„œ, min์€ ∞์—์„œ ์‹œ์ž‘ํ• ๊นŒ?

Max(์ปดํ“จํ„ฐ)๋Š” "๊ฐ€๋Šฅํ•œ ํฐ ์ ์ˆ˜"๋ฅผ ์ฐพ๋Š” ์—ญํ• ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์ž‘๊ฐ’์„ -∞๋กœ ๋‘ฌ์•ผ ํ•œ๋‹ค → ์–ด๋–ค ์‹ค์ œ ์ˆซ์ž๋ฅผ ๋งŒ๋‚˜๋„ "๊ทธ๊ฑด ์ง€๊ธˆ๋ณด๋‹ค ํฌ๋‹ค"๊ณ  ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์Œ

Min(์ƒ๋Œ€, ์‚ฌ๋žŒ)์€ "๊ฐ€๋Šฅํ•œ ์ž‘์€ ์ ์ˆ˜"๋ฅผ ์ฐพ๋Š” ์—ญํ• ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์ž‘๊ฐ’์„ +∞๋กœ ๋‘ฌ์•ผ ํ•œ๋‹ค → ์–ด๋–ค ์‹ค์ œ ์ˆซ์ž๋ฅผ ๋งŒ๋‚˜๋„ "๊ทธ๊ฑด ์ง€๊ธˆ๋ณด๋‹ค ์ž‘๋‹ค"๊ณ  ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์Œ

 

โžก๏ธMax๋Š” ์ตœ์†Ÿ๊ฐ’์—์„œ ์ถœ๋ฐœํ•ด์„œ ์ ์  ๋” ์ข‹์€(ํฐ)๊ฑธ ์ฐพ๊ณ , Min์€ ์ตœ๋Œ“๊ฐ’์—์„œ ์ถœ๋ฐœํ•ด์„œ ์ ์  ๋” ๋‚˜์œ(์ž‘์€)๊ฒƒ์„ ์ฐพ๋Š”๋‹ค.

โžก๏ธ์ฒ˜์Œ์—๋Š” ์•„๋ฌด ์ง€์‹๋„ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด๋Ÿ‰๋Œ€์ˆ˜๊ฐ’์„ ๋‘”๋‹ค.

 

์•ŒํŒŒ - ๋ฒ ํƒ€ ๊ฐ€์ง€์น˜๊ธฐ ์˜ˆ์‹œ(์ฝ”๋“œ๋กœ ๋ณด๊ธฐ)

1. Max ์ฐจ๋ก€์˜ ๊ฒฝ์šฐ

let maxEval = -Infinity
for (let child of children) {
  const eval = miniMax(child, depth - 1, alpha, beta, false)
  maxEval = Math.max(maxEval, eval)
  if (beta <= alpha) break // ๊ฐ€์ง€์น˜๊ธฐ
}

์ฒซ๋ฒˆ์งธ ์ž์‹์ด 3์ด๋ฉด : maxEval = max(- ∞, 3) = 3

๋‘๋ฒˆ์งธ ์ž์‹์ด 7์ด๋ฉด : maxEval = max(3, 7) = 7

์„ธ๋ฒˆ์งธ ์ž์‹์ด 2์ด๋ฉด : maxEval = max(7, 2) = 7

...

์ฆ‰ ๊ณ„์† ํฐ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋ฉด์„œ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ์•„๊ฐ„๋‹ค.

 

2. Min ์ฐจ๋ก€์˜ ๊ฒฝ์šฐ

let minEval = Infinity
for (let child of children) {
  const eval = miniMax(child, depth -1, alpha, beta, true)
  minEval = Math.min(minEval, eval)
  if (beta <= alpha) break // ๊ฐ€์ง€์น˜๊ธฐ
}

์ฒซ๋ฒˆ์งธ ์ž์‹์ด 5๋ฉด : minEval = min(∞, 5) = 5

๋‘๋ฒˆ์งธ ์ž์‹์ด 2์ด๋ฉด : minEval = min(5, 2) = 2

์„ธ๋ฒˆ์งธ ์ž์‹์ด 8์ด๋ฉด : minEval = min(2, 8) = 2

...

์ฆ‰ ๊ณ„์† ์ž‘์€ ๊ฐ’์œผ๋กœ ์ตœ์†Ÿ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

 

3. ์˜์‚ฌ ์ฝ”๋“œ

function alphabeta(node, depth, α, β, maximizingPlayer)
     if depth = 0 or node is a terminal node
         return the heuristic value of node
     if maximizingPlayer
         v := -∞
         for each child of node
             v := max(v, alphabeta(child, depth - 1, α, β, FALSE))
             α := max(α, v)
             if β ≤ α
                 break (* β cut-off *)
         return v
     else
         v := ∞
         for each child of node
             v := min(v, alphabeta(child, depth - 1, α, β, TRUE))
             β := min(β, v)
             if β ≤ α
                 break (* α cut-off *)
         return v

 

 

 

 


[์ฐธ๊ณ  ์ž๋ฃŒ]

https://hello-kk.tistory.com/580

 

์•ŒํŒŒ๋ฒ ํƒ€ ๊ฐ€์ง€์น˜๊ธฐ Alpha-beta pruning ์„ค๋ช…

์•ŒํŒŒ๋ฒ ํƒ€ ๊ฐ€์ง€์น˜๊ธฐ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ฐพ์•„๋ณด๋ฉฐ ํ•™์Šตํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.๋Œ“๊ธ€ ๋‚ด์šฉ ๊ผญ ํ™•์ธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋ฆผ๊ณผ ๊ทธ๋ฆผ ํ•˜๋‹จ์— ์„ค๋ช…์„ ์ฐธ๊ณ ํ•˜์‹œ

hello-kk.tistory.com

https://lordofkangs.tistory.com/205

 

[์ธ๊ณต์ง€๋Šฅ] ๊ฒŒ์ž„ํŠธ๋ฆฌ ( ์•ŒํŒŒ๋ฒ ํƒ€ ๊ฐ€์ง€์น˜๊ธฐ )

[์ธ๊ณต์ง€๋Šฅ] ๊ฒŒ์ž„ํŠธ๋ฆฌ ( MiniMax ์•Œ๊ณ ๋ฆฌ์ฆ˜ ) ์ธ๊ณต์ง€๋Šฅ์—๊ฒŒ ๊ฒŒ์ž„์ด๋ž€? ๊ฒŒ์ž„์€ ์ถ”์ƒ์ ์œผ๋กœ ์ •์˜๊ฐ€๋Šฅํ•˜๋ฉฐ ๋น„๊ต์  ์ ์€ ์—ฐ์‚ฐ์ž๋ฅผ ๊ฐ€์ง„๋‹ค. ๊ฒŒ์ž„์˜ ์ธ๊ณต์ง€๋Šฅ ๊ตฌํ˜„์€ ์ง€์  ๋Šฅ๋ ฅ๊ณผ ๊ด€๋ จ์žˆ๋‹ค๊ณ  ์—ฌ๊ฒจ์ง„๋‹ค. ๊ฒŒ

lordofkangs.tistory.com

https://ssollacc.tistory.com/43

 

[์ธ๊ณต์ง€๋Šฅ] ๊ฒŒ์ž„ ํŠธ๋ฆฌ - ๋ฏธ๋‹ˆ๋งฅ์Šค(minimax) ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์•ŒํŒŒ๋ฒ ํƒ€ ๊ฐ€์ง€์น˜๊ธฐ, ํœด๋ฆฌ์Šคํ‹ฑ ํ‰๊ฐ€ ํ•จ์ˆ˜(evaluat

์ธ๊ณต์ง€๋Šฅ์—์„œ ๊ฒŒ์ž„์€ ์ƒ๋‹จํžˆ ์ข‹์€ ์—ฐ๊ตฌ์ฃผ์ œ ์ž…๋‹ˆ๋‹ค. Tic-Tac-Toe๋‚˜ ์ฒด์Šค, ๋ฐ”๋‘‘๊ณผ ๊ฐ™์€ ๊ฒŒ์ž„์€ ์ถ”์ƒ์ ์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ณ  ์ง€์  ๋Šฅ๋ ฅ๊ณผ ์—ฐ๊ด€์ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„์˜ ๊ทœ์น™์„ ์•„๋ž˜์™€

ssollacc.tistory.com

https://ko.wikipedia.org/wiki/%EC%95%8C%ED%8C%8C-%EB%B2%A0%ED%83%80_%EA%B0%80%EC%A7%80%EC%B9%98%EA%B8%B0

 

์•ŒํŒŒ-๋ฒ ํƒ€ ๊ฐ€์ง€์น˜๊ธฐ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „. ์•ŒํŒŒ-๋ฒ ํƒ€ ๊ฐ€์ง€์น˜๊ธฐ(Alpha–beta pruning)๋Š” ํƒ์ƒ‰ ํŠธ๋ฆฌ์—์„œ ์ตœ์†Œ๊ทน๋Œ€ํ™”(๋ฏธ๋‹ˆ๋งฅ์Šค) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•  ๋•Œ ํ‰๊ฐ€(evaluate)ํ•˜๋Š” ๋…ธ๋“œ์˜ ์ˆ˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

ko.wikipedia.org