
2์ฐจ์ ๋ฌธ์ ๋ฐฐ์ด board์ ๋ฌธ์์ด word๊ฐ ์ฃผ์ด์ง๋ค.
board ์์์ ์ธ์ ํ ๋ฌธ์๋ค์ ์ฐ๊ฒฐํ์ฌ word๋ฅผ ๋ง๋ค ์ ์๋์ง ํ๋จํ๋ ๋ฌธ์ ์ด๋ค!
board์ ๋ชจ๋ ์์น๋ฅผ ์ํํ๋ฉฐ board[i][j] == word.charAt(0)์ธ ์์น๋ฅผ ์ฐพ๋๋ค.word์ ๋ค์ ๋ฌธ์(index)์ ๋น๊ตํ๋ค.visited๋ฐฐ์ด๋ก ์ฒดํฌํ๋ฉด์ ์ค๋ณต ํ์์ ๋ฐฉ์งํ๋ค.true๋ฅผ ๋ฆฌํดํ๋ค.board[newR][newC] == word.charAt(index) ์ด๊ณ ,visited[newR][newC] == false์ธ ๊ฒฝ์ฐ์๋ง ๋ค์ DFS๋ก ์งํํ๋ค.index == word.lentgth()์ ๋๋ฌํ๋ฉด ํ์ ์ฑ๊ณต์ด๋ฏ๋ก true๋ฅผ ๋ฐํํ๋ค.true์ด๋ฉด ์ ์ฒด ๊ฒฐ๊ณผ๋ true์ด๋ค.false๋ฅผ ๋ฐํํ๋ค.class Solution {
// ์ํ์ข์ฐ ์ด๋์ ์ํ ๋ฐฉํฅ ๋ฐฐ์ด
int[][] step = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
// DFS ๋ฉ์๋: ํ์ฌ ์์น์์ ๋ค์ ๋ฌธ์๋ฅผ ํ์ํ๋ฉฐ word๋ฅผ ์ฐพ๋ ์ฌ๊ท ํจ์
public boolean dfs(char[][] board, String word, boolean[][] visited, int r, int c, int index) {
// word ์ ์ฒด๋ฅผ ์ฐพ์์ผ๋ฉด true ๋ฆฌํด
if (index == word.length()) {
return true;
}
// 4๋ฐฉํฅ์ผ๋ก ํ์ (์ํ์ข์ฐ)
for (int i = 0; i < 4; i++) {
int newR = r + step[i][0];
int newC = c + step[i][1];
// ๋ฒ์ ์์ ์๊ณ , ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฉฐ, ๋ค์ ๋ฌธ์๊ฐ ์ผ์นํ๋ ๊ฒฝ์ฐ
if (newR >= 0 && newR < board.length && newC >= 0 && newC < board[0].length &&
!visited[newR][newC] && board[newR][newC] == word.charAt(index)) {
visited[newR][newC] = true; // ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
// ๋ค์ ๋ฌธ์ ์ฐพ๊ธฐ ์ํด ์ฌ๊ท ํธ์ถ
if (dfs(board, word, visited, newR, newC, index + 1)) {
return true; // ๊ฒฝ๋ก ์ฐพ์
}
visited[newR][newC] = false; // ๋ฐฑํธ๋ํน
}
}
return false; // ํ์ฌ ๊ฒฝ๋ก๋ก๋ word ์์ฑ ๋ถ๊ฐ๋ฅ
}
// ์์ ์ง์ ์ ์ฐพ๊ณ DFS ์ํํ๋ ๋ฉ์๋
public boolean exist(char[][] board, String word) {
// board ์ ์ฒด๋ฅผ ์ํ
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[i].length; j++) {
// word์ ์ฒซ ๊ธ์์ ์ผ์นํ๋ ์ง์ ์ ์์์ ์ผ๋ก DFS ์์
if (board[i][j] == word.charAt(0)) {
boolean[][] visited = new boolean[board.length][board[i].length]; // ๋ฐฉ๋ฌธ ๋ฐฐ์ด ์ด๊ธฐํ
visited[i][j] = true; // ์์ ์์น ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
// DFS ์์: index๋ ๋ค์ ๊ธ์๋ฅผ ์๋ฏธํ๋ฏ๋ก 1๋ถํฐ ์์
if (dfs(board, word, visited, i, j, 1)) {
return true; // ์ฐพ์ผ๋ฉด true ๋ฆฌํด
}
}
}
}
return false; // ๋ชจ๋ ๊ฒฝ๋ก ํ์ํด๋ ์ฐพ์ง ๋ชปํ๋ฉด false
}
}
์ค๋๋ ํด๋๐ช