๋ฌธ์ ํ์
๋ฌธ์๊ฐ ์ฑ์์ ธ์๋ m*n
ํฌ๊ธฐ์ ๋ณด๋๊ฐ ์ฃผ์ด์ง๋ค.
๋ฌธ์์ด์ด ์ฃผ์ด์ง๋๋ฐ, ํด๋น ๋ฌธ์์ด์ ๋ง๋ค ์ ์์ผ๋ฉด ๋ฐํํ๋ค.
ํ์ด
1๏ธโฃ ๋ฐฑํธ๋ํน๊ณผ Set ์ด์ฉํ ํ์ด
๐ก ๋ ์ค๋ฅธ Idea
๋ฐฑํธ๋ํน์ผ๋ก ๋ง๋ค ์ ์๋ ๋ฌธ์์ด์ ๋ชจ๋ ๊ตฌํด๋ณธ๋ค. ( ์ต๋ ๊ธธ์ด 10์ผ๋ก)
๊ตฌํ ๋ฌธ์์ด์Set
์ ๋ฃ๊ณ , ์ฃผ์ด์ง๋ ๋ฌธ์์ด์ดSet
์ ๋ค์ด์๋์ง ํ์ธํ๋ค.
import java.util.*;
class Solution {
int R;
int C;
boolean[][] checked;
StringBuilder str = new StringBuilder();
int[] dr = {1, -1, 0, 0};
int[] dc = {0, 0, 1, -1};
char[][] board;
Set<String> set = new HashSet<>();
public List<String> findWords(char[][] board, String[] words) {
List<String> ans = new ArrayList<>();
this.board = board;
R = board.length;
C = board[0].length;
checked = new boolean[R][C];
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
checked[r][c] = true;
str.append(board[r][c]);
search(r, c);
str.deleteCharAt(0);
checked[r][c] = false;
}
}
for (String word : words) {
if (set.contains(word)) {
ans.add(word);
}
}
return ans;
}
private void search(int r, int c) {
set.add(str.toString());
if (str.length() >= 10) {
return;
}
for (int i = 0; i < 4; i++) {
int nr = r + dr[i], nc = c + dc[i];
if (0 <= nr && nr < R && 0 <= nc && nc < C && !checked[nr][nc]) {
checked[nr][nc] = true;
str.append(board[nr][nc]);
search(nr, nc);
checked[nr][nc] = false;
str.deleteCharAt(str.length() - 1);
}
}
}
}
๊ฒฐ๊ณผ
2๏ธโฃ ๋ฐฑํธ๋ํน๊ณผ Trie ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ ํ์ด
๐ก ๋ ์ค๋ฅธ IdeaTrie
์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ฉด ์๊ฐ์ ๊ฐ์ ํ ์ ์์ ๊ฒ์ด๋ผ ํ๋จํ๋ค.
๋จผ์ , ์ฐพ์์ผ ํ๋ ๋ฌธ์์ด์Trie
์๋ฃ๊ตฌ์กฐ์ ๋ฃ๋๋ค.
๊ทธ๋ฆฌ๊ณ , ๋ฐฑํธ๋ํน์ ํตํด ๋ฌธ์์ด์ ์์ฑํ๋๋ฐ,Trie
์๋ฃ๊ตฌ์กฐ์ ์กด์ฌํ๋์ง ์ฒดํฌํ๋ค.
๋ง์ฝ, ๋ฐฑํธ๋ํน์ ํตํด ์์ฑํ ๋ฌธ์์ด์ด ์ ๋์ด๊ฐ ์๋๊ณ ์์ ํ ๋ฌธ์์ด์ด๋ผ๋ฉด ์ ๋ต ๋ฆฌ์คํธ์ ์ถ๊ฐํด์ค๋ค.
์ ๋์ด๋ก์ ์กด์ฌํ์ง ์์ผ๋ฉด ๋ฐฑํธ๋ํน์ ์ข ๋ฃํ๋ค.
๊ทธ๋ฆฌ๊ณ , ์์ ํ ๋ฌธ์์ด์ ์ฐพ์ ์ ๋ต ๋ฆฌ์คํธ์ ๊ธฐ๋กํ๋ ๊ฒฝ์ฐ ์ค๋ณต ๋ฐฉ์ง๋ฅผ ์ํดisEndOfWord
ํ๋๋ฅผfalse
๋ก ๋ณ๊ฒฝํด์ค๋ค.
import java.util.*;
class Solution {
int R;
int C;
boolean[][] checked;
char[][] board;
int[] dr = {1, -1, 0, 0};
int[] dc = {0, 0, 1, -1};
Trie trie = new Trie();
StringBuilder sb = new StringBuilder();
List<String> ans = new ArrayList<>();
public List<String> findWords(char[][] board, String[] words) {
this.board = board;
R = board.length;
C = board[0].length;
checked = new boolean[R][C];
// ์ฐพ์์ผ ํ๋ ๋ฌธ์์ด์ Trie ์ ๋ฃ์ด์ค๋ค.
for (String word : words) {
trie.insert(word);
}
// ๊ฐ ์์์ ์์ ๋ง๋ค ์ ์๋ ๋ชจ๋ ๋ฌธ์์ด์ ํ์ํด๋ณธ๋ค.
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
checked[r][c] = true;
sb.append(board[r][c]);
bt(r, c, trie.root);
checked[r][c] = false;
sb.deleteCharAt(sb.length() - 1);
}
}
return ans;
}
public void bt(int r, int c, Node node) {
char ch = board[r][c];
// ์ง๊ธ๊น์ง ํ์ํด์จ ์ ๋์ด๋ฅผ ๊ฐ๋ ๋ฌธ์๊ฐ Trie์ ์๋ ๊ฒฝ์ฐ
if (!node.children.containsKey(ch)) {
return;
}
Node child = node.children.get(ch);
// ์ง๊ธ๊น์ง ํ์ํด์จ ๋ฌธ์์ด์ด ๋์ ํด๋นํ๋ ๋ฌธ์์ธ ๊ฒฝ์ฐ ์ถ๊ฐ
if (child.isEndOfWord) {
ans.add(sb.toString());
child.isEndOfWord = false;
}
// ๋ฐฑํธ๋ํน
for (int i = 0; i < 4; i++) {
int nr = r + dr[i], nc = c + dc[i];
if (0 <= nr && nr < R && 0 <= nc && nc < C && !checked[nr][nc]) {
checked[nr][nc] = true;
sb.append(board[nr][nc]);
bt(nr, nc, child);
checked[nr][nc] = false;
sb.deleteCharAt(sb.length() - 1);
}
}
}
}
// Trie ์๋ฃ๊ตฌ์กฐ ๊ตฌํ
class Trie {
Node root;
public Trie() {
this.root = new Node();
}
public void insert(String word) {
insert(this.root, word);
}
private void insert(Node node, String word) {
if (word.length() == 0) {
node.isEndOfWord = true;
return;
}
char ch = word.charAt(0);
Node child;
if (!node.children.containsKey(ch)) {
child = new Node();
node.children.put(ch, child);
} else {
child = node.children.get(ch);
}
insert(child, word.substring(1));
}
public boolean search(String word) {
return search(this.root, word);
}
private boolean search(Node node, String word) {
if (word.length() == 0) {
return node.isEndOfWord;
}
char ch = word.charAt(0);
if (!node.children.containsKey(ch)) {
return false;
}
return search(node.children.get(ch), word.substring(1));
}
}
class Node {
Map<Character, Node> children;
boolean isEndOfWord;
public Node() {
this.children = new HashMap<>();
this.isEndOfWord = false;
}
}
๊ฒฐ๊ณผ
๐ ํ๊ณ
์ฒ์์๋, Set
์ ํ์ ์ O(1) ๋ก ํ ์ ์๋๋ฐ ์ด๊ฒ ๋ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ด ์๋๊น ํ๋ค.
ํ์ง๋ง, Trie
๋ฅผ ์ด์ฉํ๋ ๊ฒฝ์ฐ, ์ ๋์ด์ ํด๋นํ๋ ๋ฌธ์์ด์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ ํ์์ ๋ฐ๋ก ์ข
๋ฃํ ์ ์์ด์ ๋ ๋น ๋ฅธ ์ฑ๋ฅ์ ๋ณด์๋ ๊ฒ ๊ฐ๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ๋ฐ๋ก Trie
๋ฅผ ์ฌ์ฉํด์ผ์ง ๋ผ๋ ์๊ฐ์ ๋ ์ฌ๋ฆฌ๋ ๊ฒ์ ํ๋ค ๊ฒ ๊ฐ๊ธดํ์ง๋ง..ใ
Trie
๊ด๋ จ ๋ฌธ์ 3๊ฐ๋ฅผ ํ๋ฉด์ Trie
์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ํ์คํ๊ฒ ์ตํ ๊ฒ ๊ฐ๋ค.
์๊ฐ์ด ์ง๋๊ณ ๋์ ์ด ๋ฌธ์ ๋ฅผ ๋ค์ ํ์ด๋ณด๋ฉด ๋์ฑ ์๋ฏธ๊ฐ ์์ ๊ฒ ๊ฐ๋ค.