[LeetCode] Word Search ๐Ÿ” (Java)

hoonssacยท2025๋…„ 6์›” 17์ผ

Coding test

๋ชฉ๋ก ๋ณด๊ธฐ
7/9
post-thumbnail

๐Ÿงฉ ๋ฌธ์ œ ํŒŒ์•…

2์ฐจ์› ๋ฌธ์ž ๋ฐฐ์—ด board์™€ ๋ฌธ์ž์—ด word๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
board ์•ˆ์—์„œ ์ธ์ ‘ํ•œ ๋ฌธ์ž๋“ค์„ ์—ฐ๊ฒฐํ•˜์—ฌ word๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค!

  • ๐Ÿ…พ๏ธ ๊ฐ™์€ ์นธ์„ ๋‘ ๋ฒˆ ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
  • โŽ ๊ฒฝ๋กœ๋Š” ์˜ค์ง ์ƒํ•˜์ขŒ์šฐ๋กœ๋งŒ ์ด๋™ ๊ฐ€๋Šฅ

๐Ÿ’ก ์ ‘๊ทผ ๋ฐฉ๋ฒ•

๋ฌธ์ž ์ผ์น˜ ์‹œ์ž‘์  ์ฐพ๊ธฐ

  • board์˜ ๋ชจ๋“  ์œ„์น˜๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ board[i][j] == word.charAt(0)์ธ ์œ„์น˜๋ฅผ ์ฐพ๋Š”๋‹ค.
  • ํ•ด๋‹น ์œ„์น˜์—์„œ DFS ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•œ๋‹ค.

DFS ํƒ์ƒ‰

  • ํ˜„์žฌ ์œ„์น˜์—์„œ ์ƒํ•˜์ขŒ์šฐ ์ธ์ ‘ํ•œ ์œ„์น˜๋กœ ์ด๋™ํ•˜๋ฉฐ 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
    }
}
profile
ํ›ˆ์‹น์˜ ๊ฐœ๋ฐœ์—ฌํ–‰

2๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2025๋…„ 6์›” 17์ผ

์˜ค๋Š˜๋„ ํ•ด๋ƒ„๐Ÿ’ช

1๊ฐœ์˜ ๋‹ต๊ธ€