TIL_20250315_dfs

Kim jisuยท2025๋…„ 3์›” 15์ผ

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
18/43

๐Ÿ“Œ TIL: DFS๋ฅผ ํ™œ์šฉํ•œ ์‚ผ์ด์‚ฌ ๋ฌธ์ œ ํ•ด๊ฒฐ

๊ทธ๋™์•ˆ ์‰ฌ์šด ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งŒ ํ’€๋‹ค๊ฐ€ ์˜ค๋žœ๋งŒ์— ๊ธฐ๋ฒ•์„ ์“ฐ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ‘ธ๋‹ˆ ๊ฐ€๋ฌผ๊ฐ€๋ฌผํ•˜๋‹ค. ๋งค์ผ๋งค์ผ ํ’€ ๊ฑฐ๋‹ˆ ํ™•์‹คํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๊ณ  ๊ฐ€์ž! ๐Ÿš€


๐Ÿ“Œ ๋ฌธ์ œ ๋ถ„์„

number ๋ฐฐ์—ด์—์„œ 3๋ช…์˜ ํ•™์ƒ์„ ์„ ํƒํ–ˆ์„ ๋•Œ, ํ•ฉ์ด 0์ด ๋˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

  • ๋‹จ์ˆœํ•œ for ๋ฃจํ”„(O(Nยณ))๋กœ ํ’€ ์ˆ˜๋„ ์žˆ์ง€๋งŒ,
  • ๋ฐฑํŠธ๋ž˜ํ‚น(DFS)์„ ํ™œ์šฉํ•˜์—ฌ ์กฐํ•ฉ ํƒ์ƒ‰์„ ์ตœ์ ํ™”ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

1๏ธโƒฃ DFS๋ฅผ ํ™œ์šฉํ•œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•

DFS๋ฅผ ํ™œ์šฉํ•˜์—ฌ 3๋ช…์˜ ํ•™์ƒ์„ ์กฐํ•ฉ์„ ํƒ์ƒ‰ํ•˜๊ณ , ํ•ฉ์ด 0์ธ์ง€ ์ฒดํฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ… ํ•ต์‹ฌ ๋กœ์ง

  1. ํ•™์ƒ 3๋ช…์„ ์„ ํƒํ•  ๋•Œ๊นŒ์ง€ ์žฌ๊ท€ ํ˜ธ์ถœ (count == 3์ด๋ฉด ์ข…๋ฃŒ)
  2. ํ•ฉ์ด 0์ธ์ง€ ์ฒดํฌํ•˜๊ณ  ์ •๋‹ต ๊ฐœ์ˆ˜ ์ฆ๊ฐ€
  3. ๋ฐฑํŠธ๋ž˜ํ‚น์„ ํ†ตํ•ด ๋‹ค์Œ ์กฐํ•ฉ์„ ํƒ์ƒ‰

2๏ธโƒฃ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ

class Solution {
    int answer = 0; // ์ •๋‹ต ๊ฐœ์ˆ˜ ์ €์žฅ

    public int solution(int[] number) {
        dfs(number, 0, 0, 0); // ์ดˆ๊ธฐ DFS ํ˜ธ์ถœ (์ธ๋ฑ์Šค 0๋ถ€ํ„ฐ ์‹œ์ž‘)
        return answer;
    }

    public void dfs(int[] number, int index, int count, int sum) {
        if (count == 3) { // ํ•™์ƒ 3๋ช…์„ ์„ ํƒํ•œ ๊ฒฝ์šฐ
            if (sum == 0) answer++; // ํ•ฉ์ด 0์ด๋ฉด ์ •๋‹ต ์ฆ๊ฐ€
            return;
        }

        for (int i = index; i < number.length; i++) { // ํ˜„์žฌ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ํƒ์ƒ‰
            dfs(number, i + 1, count + 1, sum + number[i]); // ๋‹ค์Œ ์กฐํ•ฉ ํƒ์ƒ‰
        }
    }
}

3๏ธโƒฃ DFS ์‹คํ–‰ ํ๋ฆ„

number = {-2, 3, 0, 2, -5} ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, DFS๊ฐ€ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

DFS(0, 0, 0)
 โ”œโ”€ DFS(1, 1, -2)
 โ”‚   โ”œโ”€ DFS(2, 2, 1)
 โ”‚   โ”‚   โ”œโ”€ DFS(3, 3, 1) โ†’ X (sum != 0)
 โ”‚   โ”‚   โ”œโ”€ DFS(4, 3, -4) โ†’ X (sum != 0)
 โ”‚   โ”‚
 โ”‚   โ”œโ”€ DFS(3, 2, -2)
 โ”‚   โ”‚   โ”œโ”€ DFS(4, 3, 0) โ†’ โœ… ์ •๋‹ต 1
 โ”‚   โ”‚
 โ”‚   โ”œโ”€ DFS(4, 2, -7)
 โ”‚
 โ”œโ”€ DFS(2, 1, 3)
 โ”‚   โ”œโ”€ DFS(3, 2, 3)
 โ”‚   โ”‚   โ”œโ”€ DFS(4, 3, 0) โ†’ โœ… ์ •๋‹ต 2

๐Ÿ’ก ์ •๋‹ต: (์ฒซ ๋ฒˆ์งธ, ์„ธ ๋ฒˆ์งธ, ๋„ค ๋ฒˆ์งธ) / (๋‘ ๋ฒˆ์งธ, ๋„ค ๋ฒˆ์งธ, ๋‹ค์„ฏ ๋ฒˆ์งธ) ์กฐํ•ฉ 2๊ฐœ ๋ฐœ๊ฒฌ!


4๏ธโƒฃ DFS vs ์‚ผ์ค‘ for๋ฌธ ๋น„๊ต

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ํ’€์ด๋ฅผ ๋ณด๋‹ˆ 3์ค‘ for๋ฌธ์ด ์••๋„์ ์œผ๋กœ ๋งŽ๊ณ ,
bfs & combination์„ ๊ตฌํ˜„ํ•œ ์‚ฌ๋žŒ๋„ ์žˆ์—ˆ๋‹ค.

์กฐ๊ฑด์ด ์—†๋Š” ๊ฒฝ์šฐ & ์ˆ˜ํ–‰ ํšŸ์ˆ˜๊ฐ€ ์ ์€ ๊ฒฝ์šฐ์—๋Š” 3์ค‘ for๋ฌธ์ด ํšจ์œจ์ ์ธ๊ฒŒ ์‚ด์ง ์ถฉ๊ฒฉ์ด์—ˆ๋‹ค.

๋ฐฉ๋ฒ•์‹œ๊ฐ„ ๋ณต์žก๋„์žฅ์ ๋‹จ์ 
DFS (ํ˜„์žฌ ์ฝ”๋“œ)O(2^N) โ‰ˆ O(Nยณ)์œ ์—ฐํ•œ ํƒ์ƒ‰ ๊ฐ€๋Šฅ์Šคํƒ ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
์‚ผ์ค‘ for ๋ฃจํ”„O(Nยณ)๊ฐ€์žฅ ๋น ๋ฆ„, ๋‹จ์ˆœํ•จํ™•์žฅ์„ฑ์ด ๋‚ฎ์Œ

๐Ÿš€ ๊ฒฐ๋ก 

1๏ธโƒฃ ์ด ๋ฌธ์ œ์—์„œ๋Š” for ๋ฃจํ”„๊ฐ€ ๋” ๋น ๋ฅด์ง€๋งŒ,
2๏ธโƒฃ DFS๋Š” ์กฐํ•ฉ์„ ์ฐพ์„ ๋•Œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ค‘์š”ํ•œ ๊ธฐ๋ฒ•์ด๋ฏ€๋กœ ํ™•์‹คํžˆ ์ตํ˜€์•ผ ํ•œ๋‹ค!


5๏ธโƒฃ ์˜ค๋Š˜์˜ ๋ฐฐ์šด ์ 

โœ… DFS๋กœ ์กฐํ•ฉ์„ ์ฐพ์„ ๋•Œ๋Š” index๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด์„œ ์ค‘๋ณต ์„ ํƒ์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•œ๋‹ค.
โœ… ๋ฐฑํŠธ๋ž˜ํ‚น์„ ํ™œ์šฉํ•˜๋ฉด ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ๋œ๋‹ค.
โœ… ์‚ผ์ค‘ for ๋ฃจํ”„๊ฐ€ ๊ฐ€๋Šฅํ•  ๋•Œ๋Š” for๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฅด๋‹ค.

๐ŸŽฏ ๋‚ด์ผ์€ DFS + ๋ฐฑํŠธ๋ž˜ํ‚น์„ ํ™œ์šฉํ•œ ๋‹ค๋ฅธ ์กฐํ•ฉ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด์ž! ๐Ÿš€

profile
Dreamer

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