Skip to content

Commit c41e3be

Browse files
authored
백트래킹 사용.
1 parent d35c00d commit c41e3be

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

word-search/yeonguchoe.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
class Solution {
2+
public:
3+
bool backtrack(vector<vector<char>>& board, const string& word,
4+
int current_row, int current_column, int index) {
5+
// 이전 iteration까지 backtrack을 통과한 경우
6+
// index가 단어의 길이와 같아지는 경우
7+
if (index == word.size()) {
8+
return true;
9+
}
10+
11+
// 탐색중인 cell이 board를 넘어선 경우
12+
if (current_row < 0 || current_row >= board.size() ||
13+
current_column < 0 || current_column >= board[0].size()) {
14+
return false;
15+
}
16+
17+
// 탐색중인 cell에 있는 문자가 단어의 문자와 다른 경우
18+
if (board[current_row][current_column] != word[index]) {
19+
return false;
20+
}
21+
22+
// 탐색중인 cell의 문자를 글자가 아닌것으로 지정하여, 방문 표시
23+
char temp = board[current_row][current_column];
24+
board[current_row][current_column] = '#';
25+
26+
// 탐색중인 cell의 주변을 backtrack으로 탐색
27+
bool found =
28+
backtrack(board, word, current_row - 1, current_column,
29+
index + 1) or
30+
backtrack(board, word, current_row, current_column - 1,
31+
index + 1) or
32+
backtrack(board, word, current_row + 1, current_column,
33+
index + 1) or
34+
backtrack(board, word, current_row, current_column + 1, index + 1);
35+
36+
// 탐색중인 cell의 값을 원래대로 돌려 놓음
37+
board[current_row][current_column] = temp;
38+
39+
// 만약에 찾아진 경우, true를 위로 올림
40+
// 만약에 탐색 도중에 2가지 false를 반환하는 케이스에 걸렸으면 false를
41+
// 위로 올림
42+
return found;
43+
}
44+
45+
bool exist(vector<vector<char>>& board, string word) {
46+
47+
// 시작점을 설정
48+
for (int row = 0; row < board.size(); ++row) {
49+
for (int col = 0; col < board[0].size(); ++col) {
50+
// 만약에 backtrack 함수가 true인 경우를 찾았으면, true 반환
51+
if (backtrack(board, word, row, col, 0)) {
52+
return true;
53+
}
54+
}
55+
}
56+
// true인 경우를 한번도 찾지 못했다면, false 반환
57+
return false;
58+
}
59+
};

0 commit comments

Comments
 (0)