[Algospot_BOGGLE] 보글 게임 Python 풀이
출처: Algospot 온라인 저지
문제
보글(Boggle) 게임은 그림 (a)와 같은 5x5 크기의 알파벳 격자인 게임판의 한 글자에서 시작해서 펜을 움직이면서 만나는 글자를 그 순서대로 나열하여 만들어지는 영어 단어를 찾아내는 게임입니다. 펜은 상하좌우, 혹은 대각선으로 인접한 칸으로 이동할 수 있으며 글자를 건너뛸 수는 없습니다. 지나간 글자를 다시 지나가는 것은 가능하지만, 펜을 이동하지않고 같은 글자를 여러번 쓸 수는 없습니다.
예를 들어 그림의 (b), (c), (d)는 각각 (a)의 격자에서 PRETTY, GIRL, REPEAT을 찾아낸 결과를 보여줍니다.
보글 게임판과 알고 있는 단어들의 목록이 주어질 때, 보글 게임판에서 각 단어를 찾을 수 있는지 여부를 출력하는 프로그램을 작성하세요.
Note: 지금부터 작성하는 솔루션은 재귀함수와 완전탐색만을 사용하여 풀은 솔루션입니다.
풀이
board = [["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"]]
# 상하좌우 / 대각선으로 움직이는 방향을 저장
dx = [-1, -1, -1, 1, 1, 1, 0, 0]
dy = [-1, 0, 1, -1, 0, 1, -1, 1]
# 시작 위치가 범위 내에 있는지 확인하는 함수
def isRange(y, x):
if y < 0 or y >= len(board):
return False
if x < 0 or x >= len(board[0]):
return False
return True
def hasWord(y, x, word):
# 시작 위치가 범위 내에 없다면 무조건 실패
if not isRange(y, x):
return False
# 첫 글자가 일치하지 않으면 무조건 실패
if board[y][x] != word[0]:
return False
# 단어 길이가 1이면 성공
if len(word) == 1:
return True
# 인접한 8칸을 검사
for i in range(8):
nextX, nextY = x + dx[i], y + dy[i]
# 위의 기저사례에서 다음 칸이 범위 내에 있는지,
# 첫 글자가 일치하는지 확인하므로 바로 재귀호출
if hasWord(nextY, nextX, word[1:]):
return True
return False
print(hasWord(1, 1, "PRETTY"))
print(hasWord(2, 0, "GIRL"))
print(hasWord(1, 2, "REPEAT"))
Leave a comment