Skip to content

Commit d0efeef

Browse files
committed
4. word search
1 parent 3b1229b commit d0efeef

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

word-search/whewchews.ts

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* 조건
3+
* 같은 단어 위치는 한번만 쓰인다
4+
* 이웃해서 연속된 단어가 있는지 찾는다
5+
6+
* 백트래킹
7+
* 모든 원소를 완전탐색하기 위한 목적으로 사용.
8+
* 단순히 완전탐색하는 것이 아니라 조건에 따라서 유망한 노드로 이동.
9+
*/
10+
function exist(board: string[][], word: string): boolean {
11+
const m = board.length;
12+
const n = board[0].length;
13+
const l = word.length;
14+
const directions = [
15+
[-1, 0], // 상
16+
[1, 0], // 하
17+
[0, -1], // 좌
18+
[0, 1], // 우
19+
];
20+
21+
const backtrack = (
22+
col: number,
23+
row: number,
24+
idx: number,
25+
visited: Set<string>
26+
): boolean => {
27+
if (idx === l) {
28+
return true;
29+
}
30+
if (
31+
col < 0 ||
32+
col >= m ||
33+
row < 0 ||
34+
row >= n ||
35+
board[col][row] !== word[idx] ||
36+
visited.has(`${col},${row}`)
37+
) {
38+
return false;
39+
}
40+
41+
visited.add(`${col},${row}`);
42+
43+
for (const [dCol, dRow] of directions) {
44+
if (backtrack(col + dCol, row + dRow, idx + 1, visited)) {
45+
return true;
46+
}
47+
}
48+
49+
visited.delete(`${col},${row}`);
50+
return false;
51+
};
52+
53+
for (let col = 0; col < m; col++) {
54+
for (let row = 0; row < n; row++) {
55+
if (backtrack(col, row, 0, new Set<string>())) {
56+
return true;
57+
}
58+
}
59+
}
60+
return false;
61+
}
62+
63+
// TC: O(m*n*4^l) <= m*n: 보드의 크기, l: 단어의 길이. 최대 4개 방향으로 이동 가능
64+
// SC: O(l) <= 단어 길이만큼 방문 가능

0 commit comments

Comments
 (0)