์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ/์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ•ด๊ฒฐ ์ „๋žต

[Python] ๋ณด๊ธ€ ๊ฒŒ์ž„ (BOGGLE)

NaNaRin๐Ÿ™ƒ 2021. 9. 23. 21:22

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ•ด๊ฒฐ ์ „๋žต - 06 ๋ฌด์‹ํ•˜๊ฒŒ ํ’€๊ธฐ (Brute-Force ๋ธŒ๋ฃจํŠธ ํฌ์Šค)

์˜ˆ์ œ: ๋ณด๊ธ€ ๊ฒŒ์ž„ (๋ฌธ์ œ ID: BOGGLE, ๋‚œ์ด๋„: ํ•˜)

๋ณด๊ธ€(boggle)์€ 5X5 ํฌ๊ธฐ์˜ ์•ŒํŒŒ๋ฒณ ๊ฒฉ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ํ•˜๋Š” ๊ฒŒ์ž„

๊ฒŒ์ž„์˜ ๋ชฉ์ ์€ ์ƒํ•˜์ขŒ์šฐ/๋Œ€๊ฐ์„ ์œผ๋กœ ์ธ์ ‘ํ•œ ์นธ๋“ค์˜ ๊ธ€์ž๋“ค์„ ์ด์–ด์„œ ๋‹จ์–ด๋ฅผ ์ฐพ์•„๋‚ด๋Š” ๊ฒƒ

๊ฐ ๊ธ€์ž๋“ค์€ ๋Œ€๊ฐ์„ ์œผ๋กœ๋„ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•œ ๊ธ€์ž๊ฐ€ ๋‘ ๋ฒˆ ์ด์ƒ ์‚ฌ์šฉ๋  ์ˆ˜๋„ ์žˆ์Œ

 

๋ฌธ์ œ ์ดํ•ดํ–ˆ๊ณ  C++๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ํŒŒ์ด์ฌ์œผ๋กœ ์ž˜ ๋ณ€๊ฒฝํ–ˆ๋‹ค

๊ทธ๋Œ€๋กœ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์‹œ์ž‘์ ์„ ์ฃผ์ง€ ์•Š๊ณ  ๋ชจ๋“  ์นธ์„ ๋Œ๋ฉด์„œ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณ€๊ฒฝํ•˜์˜€๋‹ค

# ๋ณด๊ธ€ ๊ฒŒ์ž„ํŒ์—์„œ ๋‹จ์–ด๋ฅผ ์ฐพ๋Š” ์žฌ๊ท€ ํ˜ธ์ถœ ์•Œ๊ณ ๋ฆฌ์ฆ˜

dx = [-1, -1, -1, 1, 1, 1, 0, 0]
dy = [-1, 0, 1, -1, 0, 1, -1, 1]


def hasWord(x, y, word, board):
    if 0 > x or x >= len(board) or 0 > y or y >= len(board[0]):
        return False
    elif board[x][y] != word[0]:
        return False
    elif len(word) == 1:
        return True
    for di in range(8):
        nx = x + dx[di]
        ny = y + dy[di]
        if hasWord(nx, ny, word[1:], board):
            return True
    return False


b = [['u', 'r', 'l', 'p', 'm'],
     ['x', 'p', 'r', 'e', 't'],
     ['g', 'i', 'a', 'e', 't'],
     ['x', 't', 'n', 'z', 'y'],
     ['x', 'o', 'q', 'r', 's']]


for i in range(5):
    for j in range(5):
        if hasWord(i, j, "pretty", b):
            print("์ฐพ์•˜๋‹น")

 

๊ทผ๋ฐ ์ด์ œ ์—ฌ๊ธฐ์„œ ์ฐพ์€ ๊ธ€์ž๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ์ข€ ๋” ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์‹œ์ผœ๋ณด๊ณ ์ž ํ–ˆ๋‹ค

# ๋ณด๊ธ€ ๊ฒŒ์ž„ํŒ์—์„œ ๋‹จ์–ด๋ฅผ ์ฐพ๋Š” ์žฌ๊ท€ ํ˜ธ์ถœ ์•Œ๊ณ ๋ฆฌ์ฆ˜
import copy

dx = [-1, -1, -1, 1, 1, 1, 0, 0]
dy = [-1, 0, 1, -1, 0, 1, -1, 1]


def hasWord(x, y, word, board, mboard):
    myBoard = copy.deepcopy(mboard)
    if 0 > x or x >= len(board) or 0 > y or y >= len(board[0]):
        return False
    elif board[x][y] != word[0]:
        return False
    elif len(word) == 1:
        myBoard[x][y] = word[0]
        return myBoard
    for di in range(8):
        nx = x + dx[di]
        ny = y + dy[di]
        if k := hasWord(nx, ny, word[1:], board, myBoard):
            myBoard = k
            myBoard[x][y] = word[0]
            return myBoard
    return False


def draw(board):
    for i in range(len(board)):
        for j in range(len(board[i])):
            print(board[i][j], end=" ")
        print()


b = [['u', 'r', 'l', 'p', 'm'],
     ['x', 'p', 'r', 'e', 't'],
     ['g', 'i', 'a', 'e', 't'],
     ['x', 't', 'n', 'z', 'y'],
     ['x', 'o', 'q', 'r', 's']]

mb = [['*', '*', '*', '*', '*'],
      ['*', '*', '*', '*', '*'],
      ['*', '*', '*', '*', '*'],
      ['*', '*', '*', '*', '*'],
      ['*', '*', '*', '*', '*']]

for i in range(5):
    for j in range(5):
        if k := hasWord(i, j, "pretty", b, mb):
            draw(k)
            print("์ฐพ์•˜๋‹น")

๋งŒ์กฑ์Šค๋Ÿฝ๊ฒŒ ํ’€์—ˆ๋‹ค!! ํ•˜๊ณ  ๋๋‚ด๋ ค๋‹ค๊ฐ€

๋ฌธ๋“ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ์กด์žฌํ•˜๋Š” et๋ฅผ ์ฐพ์•„๋ณด๊ณ ์ž ํ–ˆ๋Š”๋ฐ

๊ฒฐ๊ณผ๋Š” ์ฐธ๋‹ดํ•˜๊ฒŒ๋„ ๋‘ ๊ฐœ ๋ฐ–์— ๋‚˜์˜ค์ง€ ์•Š์•˜๋‹ค...

17ํ–‰์—์„œ for๋ฌธ์ด ํ•˜๋‚˜๋ฅผ ์ฐพ์•„๋ฒ„๋ฆฌ๋ฉด ๊ทธ๋Œ€๋กœ ํƒˆ์ถœํ•ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๋Œ€ ์ฐธ์‚ฌ๊ฐ€ ์ผ์–ด๋‚œ ๊ฒƒ์ด๋‹ค

๋ฌธ์ œ๋ฅผ ์ฐพ์•˜๋Š”๋ฐ ์Šฌํ”„๊ฒŒ๋„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค

์ด๊ฑธ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ๊ฒƒ์ธ๊ฐ€...

 

return์ด ์•„๋‹ˆ๋ผ ๋ฆฌ์ŠคํŠธ์— ๊ฒฐ๊ณผ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์‹์œผ๋กœ ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋  ๊ฑฐ ๊ฐ™๊ธด ํ•œ๋ฐ.... ์ผ๋‹จ ํŒจ์Šค