Skip to content

Commit 1381ad8

Browse files
committed
solved2: 79. Word Search
1 parent e202245 commit 1381ad8

File tree

1 file changed

+123
-0
lines changed

1 file changed

+123
-0
lines changed

word-search/jangwonyoon.js

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
/**
2+
* 79. Word Search
3+
* https://leetcode.com/problems/word-search/
4+
*
5+
*/
6+
7+
/*
8+
* 시간 복잡도(TC): O(m * n * 4^L)
9+
* m = 행, n = 열, L = 단어 길이
10+
*
11+
* 공간 복잡도(SC): O(L)
12+
* L = 단어 길이
13+
*
14+
* 관련 알고리즘: 깊이 우선 탐색 Depth-First Search (DFS)
15+
*
16+
* 문제 풀이 방법:
17+
* 1. 깊이 우선 탐색 (DFS)을 사용하여 시작점부터 첫 글자가 맞는 칸에서만 탐색
18+
* 2. 탐색 결과를 반환
19+
*/
20+
/**
21+
* @param {character[][]} board
22+
* @param {string} word
23+
* @return {boolean}
24+
*/
25+
var exist = function(board, word) {
26+
const rows = board.length;
27+
const cols = board[0].length;
28+
29+
function dfs(r, c, idx) {
30+
// 1) 기저: 단어를 모두 매칭했을 경우 - 탈출 조건
31+
if (idx === word.length) return true;
32+
33+
// 2) 가드: 범위/문자/방문 상태 확인
34+
if (r < 0 || r >= rows || c < 0 || c >= cols) return false;
35+
if (board[r][c] !== word[idx]) return false;
36+
if (board[r][c] === '#') return false; // 이미 방문했으면 탈락
37+
38+
// 3) 방문 마킹
39+
const tmp = board[r][c];
40+
board[r][c] = '#';
41+
42+
// 4방향 탐색 (상, 하, 좌, 우)
43+
const ok =
44+
dfs(r + 1, c, idx + 1) ||
45+
dfs(r - 1, c, idx + 1) ||
46+
dfs(r, c + 1, idx + 1) ||
47+
dfs(r, c - 1, idx + 1);
48+
49+
// 5) 복구
50+
board[r][c] = tmp;
51+
52+
return ok;
53+
}
54+
55+
// 시작점: 첫 글자와 일치하는 칸에서만 DFS 시작
56+
for (let row = 0; row < rows; row++) {
57+
for (let col = 0; col < cols; col++) {
58+
// 첫 글자가 맞으면서 dfs가 성공했을 경우 true 반환
59+
if (board[row][col] === word[0] && dfs(row, col, 0)) return true;
60+
}
61+
}
62+
63+
return false;
64+
};
65+
66+
/**
67+
* 풀이 2
68+
* 방문 배열 사용
69+
*
70+
* 시간 복잡도(TC): O(m * n * 4^L)
71+
* 공간 복잡도(SC): O(m * n)
72+
*
73+
* 관련 알고리즘: 깊이 우선 탐색 Depth-First Search (DFS)
74+
*
75+
* 문제 풀이 방법:
76+
* 1. 방문 배열을 사용하여 방문한 칸을 체크
77+
78+
* @param {character[][]} board
79+
* @param {string} word
80+
* @return {boolean}
81+
*/
82+
83+
var exist = function(board, word) {
84+
const rows = board.length;
85+
const cols = board[0].length;
86+
87+
// visited 배열 초기화
88+
const visited = Array.from({ length: rows }, () => Array(cols).fill(false));
89+
90+
function dfs(r, c, idx) {
91+
// 1) 기저 조건: 단어를 모두 찾은 경우
92+
if (idx === word.length) return true;
93+
94+
// 2) 가드 조건
95+
if (r < 0 || r >= rows || c < 0 || c >= cols) return false;
96+
if (visited[r][c]) return false;
97+
if (board[r][c] !== word[idx]) return false;
98+
99+
// 3) 방문 처리
100+
visited[r][c] = true;
101+
102+
// 4) 네 방향 탐색
103+
const ok =
104+
dfs(r + 1, c, idx + 1) ||
105+
dfs(r - 1, c, idx + 1) ||
106+
dfs(r, c + 1, idx + 1) ||
107+
dfs(r, c - 1, idx + 1);
108+
109+
// 5) 복구 (다른 경로에서 다시 쓸 수 있게)
110+
visited[r][c] = false;
111+
112+
return ok;
113+
}
114+
115+
// 6) 시작점 순회
116+
for (let r = 0; r < rows; r++) {
117+
for (let c = 0; c < cols; c++) {
118+
if (board[r][c] === word[0] && dfs(r, c, 0)) return true;
119+
}
120+
}
121+
122+
return false;
123+
};

0 commit comments

Comments
 (0)