Skip to content

[Leetcode] 79. Word Search ​

Problem ​

문제링크

보드판의 알파벳을 이어가면서 이용하여 word 를 만들기

Solution ​

DFS, Backtracking

보드판의 알파벳을 한번씩만 사용하여 인접한 알파벳을 붙어나가면서 word를 만들어내는 문제.

  1. DFS 함수를 생성
  2. 타겟을 만났을때 DFS 탈출 조건과 탐색 범위를 초과했을때 조건을 이용하여 가지치기한다.
    • 정답을 찾았을땐 성공 여부를 파악하였기 때문에 모든 함수 실행을 종료하도록한다.
    • 현재 길이가 word의 문자열 길이를 초과하였을때 실행을 종료한다.
    • 다음 인덱스가 보드판의 범위를 벗어나지 않도록한다.
    • 이미 한번 사용한 알파벳을 사용하지 못하도록한다.
    • word를 만드는데 필요한 알파벳인지 확인한다.
  3. 사용여부의 체크는 DFS가 실행이 종료되는 시점에서 이전 depth의 함수에게 돌려줘야한다.
  4. DFS의 최초 실행 조건에 word의 앞글자와 동일한지 조건을 추가하여 속도를 개선한다.

TS Code ​

ts
function exist(board: string[][], word: string): boolean {
  let answer = false
  const dirs = [
    [1, 0],
    [0, 1],
    [-1, 0],
    [0, -1],
  ]
  const visited = Array.from(Array(board.length), (_, i): boolean[] => Array(board[i].length).fill(false))
  const DFS = (y: number, x: number, str: string) => {
    if (answer) return
    if (word.length < str.length) return
    if (word === str) {
      answer = true
      return
    }

    for (const [dy, dx] of dirs) {
      const ty = dy + y
      const tx = dx + x

      if (0 <= ty && ty < board.length && 0 <= tx && tx < board[ty].length) {
        if (visited[ty][tx]) continue
        const c = board[ty][tx]
        if (c !== word[str.length]) continue
        visited[ty][tx] = true
        DFS(ty, tx, str + c)
        visited[ty][tx] = false
      }
    }
  } // DFS

  for (let i = 0; i < board.length; i++) {
    for (let j = 0; j < board[i].length; j++) {
      if (word[0] !== board[i][j]) continue

      visited[i][j] = true
      DFS(i, j, board[i][j])
      visited[i][j] = false
    }
  }

  return answer
}