์šฐ๊ทœ์ด์ธ์šฐ์œค
Eager To Learn ๐ŸŒŒ
์šฐ๊ทœ์ด์ธ์šฐ์œค
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿก ํ™ˆ
  • ๐Ÿš€ ๊นƒํ—ˆ๋ธŒ
  • โ›… ํƒœ๊ทธ ํด๋ผ์šฐ๋“œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (217)
    • ๐Ÿ‘จ๐Ÿป‍๐Ÿ’ป PS (170)
      • JAVA (82)
      • MYSQL (1)
      • Docker (2)
      • PYTHON (24)
      • LeetCode 150 (39)
      • Algorithm ๊ธฐ๋ฒ• (1)
      • ๋ฐ”ํ‚น๋… (21)
    • ๋ธ”๋กœ๊ทธ ์ด์‚ฌ (0)
    • Error (1)
    • CS (15)
      • DataBase (2)
      • OS (7)
      • Network (1)
      • Spring (1)
      • ์ž๋ฃŒ๊ตฌ์กฐ (3)
      • Java (1)
    • Learned (7)
      • Spring (7)
    • ๊ฐœ๋ฐœ์„œ์  (15)
      • ๊ฐ€์ƒ ๋ฉด์ ‘ ์‚ฌ๋ก€๋กœ ๋ฐฐ์šฐ๋Š” ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ ์„ค๊ณ„ ๊ธฐ์ดˆ (1)
      • ์˜ค๋ธŒ์ ํŠธ - ์กฐ์˜ํ˜ธ (7)
      • ์นœ์ ˆํ•œ SQL ํŠœ๋‹ (7)
    • ํšŒ๊ณ  (2)
hELLO ยท Designed By ์ •์ƒ์šฐ.
์šฐ๊ทœ์ด์ธ์šฐ์œค

Eager To Learn ๐ŸŒŒ

๐Ÿ‘จ๐Ÿป‍๐Ÿ’ป PS/LeetCode 150

[Java] 212. Word Search II

2023. 9. 12. 09:23

๋ฌธ์ œ ํŒŒ์•…

๋ฌธ์ž๊ฐ€ ์ฑ„์›Œ์ ธ์žˆ๋Š” 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 ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ํ’€์ด

๐Ÿ’ก ๋– ์˜ค๋ฅธ Idea

Trie ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜๋ฉด ์‹œ๊ฐ„์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ ํŒ๋‹จํ–ˆ๋‹ค.

๋จผ์ €, ์ฐพ์•„์•ผ ํ•˜๋Š” ๋ฌธ์ž์—ด์„ 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 ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ™•์‹คํ•˜๊ฒŒ ์ตํžŒ ๊ฒƒ ๊ฐ™๋‹ค.

 

์‹œ๊ฐ„์ด ์ง€๋‚˜๊ณ  ๋‚˜์„œ ์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ํ’€์–ด๋ณด๋ฉด ๋”์šฑ ์˜๋ฏธ๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

    '๐Ÿ‘จ๐Ÿป‍๐Ÿ’ป PS/LeetCode 150' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [Java] 373. Find K Pairs with Smallest Sums
    • [Java] 215. Kth Largest Element in an Array
    • [Java] 211. Design Add and Search Words Data Structure
    • [Java] 208. Implement Trie (Prefix Tree)
    ์šฐ๊ทœ์ด์ธ์šฐ์œค
    ์šฐ๊ทœ์ด์ธ์šฐ์œค
    ๊ฐœ๋ฐœ์ž ๊ฟˆ๋‚˜๋ฌด

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”