๐ŸŽ‰ berenickt ๋ธ”๋กœ๊ทธ์— ์˜จ ๊ฑธ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽ‰
CS
์ž๋ฃŒ๊ตฌ์กฐ&์•Œ๊ณ ๋ฆฌ์ฆ˜-js
14-bfs-dfs

1. DFS/BFS

๋„ˆ๋น„ ์šฐ์„ ํƒ์ƒ‰๊ณผ ๊นŠ์ด ์šฐ์„ ํƒ์ƒ‰์„ ์ด์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ทธ๋ฆผํŒ์˜ ํŽ˜์ธํŠธํˆด
  • ๊ทธ๋ž˜ํ”„์˜ D์—์„œ G๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ

cf. DFS BFS ๊นŠ์ด ๋„ˆ๋น„ ์šฐ์„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 5๋ถ„๋งŒ์— ์ดํ•ดํ•˜๊ธฐ

  • ๋“œ๋ผ๋งˆ ํ•˜๋‚˜๋ฅผ ๋ชฐ์•„๋ณธ๋‹ค = DFS
  • ๋“œ๋ผ๋งˆ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ํ•˜๋‚˜์”ฉ ๋ณธ๋‹ค = BFS

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ = BFS, DFS

  • ๊ทธ๋ž˜ํ”„ : ์—ฌ๋Ÿฌ ๊ฐœ์ฒด๋“ค์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ
  • ํƒ์ƒ‰ : ํŠน์ • ๊ฐœ์ฒด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

1.1 ๋Œ€ํ‘œ์ ์ธ ๋ฌธ์ œ ์œ ํ˜•

  • ๊ฒฝ๋กœํƒ์ƒ‰ ์œ ํ˜•(์ตœ๋‹จ๊ฑฐ๋ฆฌ, ์‹œ๊ฐ„)
  • ๋„คํŠธ์›Œํฌ ์œ ํ˜•(์—ฐ๊ฒฐ)
  • ์กฐํ•ฉ ์œ ํ˜•(๋ชจ๋“  ์กฐํ•ฉ ๋งŒ๋“ค๊ธฐ)

1.2 DFS ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  • ํ•œ ๋†ˆ๋งŒ ๋๊นŒ์ง€ ํŒจ๋Š” ์œ ํ˜•์ด๋ผ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ผ๋ฐ˜์ 
  • ์žฌ๊ท€๋ฅผ ํƒ€๊ณ , ํƒ€์„œ ํƒˆ์ถœ ์กฐ๊ฑด์— ๋จผ์ € ๋„๋‹ฌํ•˜๊ณ  ๊ทธ ๋‹ค์Œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ๋ฐ”๊ฟ” ๊ฐ€๋ฉด์„œ ์ •๋‹ต์„ ๊ตฌํ˜„

1.3 BFS ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  • ์—ฌ๋Ÿฌ ๋†ˆ์„ ํ•œ๋Œ€์”ฉ ๋•Œ๋ฆฌ๋ฉด์„œ ๊ฐ€๋Š” ์œ ํ˜•์ด๋ผ Queue, LinkedList๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ 
  • ๊ตฌํ˜„ ๋ฐฉ๋ฒ•
    1. ๊ฐ€์žฅ ๋จผ์ € ๋„ฃ์—ˆ๋˜ ๊ฒƒ์„ ๊บผ๋‚ด์„œ
    2. ์—ฐ๊ฒฐ๋œ ์ ์„ Queue์— ๋„ฃ๊ธฐ
    3. Queue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
  • ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Queue, LinkedList๋ฅผ ์‚ฌ์šฉ

1.4 DFS/BFS ์ค‘ ์–ด๋–ค ๊ฑธ ์จ์•ผํ•˜๋‚˜

  • ๋‘˜ ๋‹ค ํƒ์ƒ‰์„ ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ ์–ด๋–ค ๊ฑธ ์จ๋„ ์ •๋‹ต์€ ๋‚˜์˜ค์ง€๋งŒ ์ž์‹ ์žˆ๊ณ  ์†์— ์ต์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์“ฐ๋ฉด ๋œ๋‹ค.
  • DFS๋Š” BFS๋ณด๋‹ค ๋™์ž‘ ๊ฒ€์ฆ์„ ํ•˜๊ธฐ ์‰ฌ์›€
  • DFS๋Š” ํ•˜๋‚˜์˜ ์กฐํ•ฉ์„ ์™„์„ฑํ•ด์„œ ์ •๋‹ต๊ณผ ๋น„๊ตํ•˜๊ณ  ๋˜ ๋‹ค๋ฅธ ์กฐํ•ฉ์„ ๋งŒ๋“ค์–ด ๋ณด๊ณ  ์ •๋‹ต๊ณผ ๋น„๊ตํ•˜๋Š” ์‹์œผ๋กœ ๋™์ž‘
  • BFS๋Š” ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ์กฐํ•ฉ๋“ค์„ ํ•œ์นธ ํ•œ์นธ์”ฉ ๋งŒ๋“ค๋‹ค๋ณด๋‹ˆ ์กฐํ•ฉ์„ ์™„์„ฑํ•ด
    • ์ •๋‹ต๊ณผ ๋น„๊ตํ•˜๋Š” ์‹œ์ ์— ์–ธ์ œ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด ์กŒ๋Š”์ง€
    • ์–ด๋””์„œ๋ถ€ํ„ฐ ํ‹€๋ฆฐ๊ฑด์ง€๋ฅผ ๋ถ„์„ํ•˜๊ธฐ๊ฐ€ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ BFS๋„ ํ•„์š”ํ•  ๋–„๊ฐ€ ์žˆ๋Š”๋ฐ,
    • DFS๋Š” ํ•œ ๋†ˆ๋งŒ ํŒจ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ๋ฐ, ๊ทธ ํ•œ ๋†ˆ์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฉด ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋  ์ˆ˜ ์žˆ์Œ
  • ํ•œ ๋ฌธ์ œ๋ฅผ ๋‘ ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋‘ ํ’€์–ด๋ณด๋Š” ๊ฒƒ์„ ์ถ”์ฒœ

1.5 ์ •๋ฆฌ

DFSBFS
์ˆ˜ํ–‰์‹œ๊ฐ„๋ณต๋ถˆ๋ณต๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํ•œ ๊ฑธ์Œ์”ฉ ๋‚˜๊ฐ
์šด์ด ์ข‹์œผ๋ฉด ์ฒซ๋ฒˆ์งธ ์กฐํ•ฉ์ด ์ตœ์ ์˜ ๋‹ต์ตœ์•…์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ์กฐํ•ฉ์„ ๋‹ค ๋งŒ๋“ค์–ด์•ผ ํ•จ์ดˆ๋ฐ˜์— ๋А๋ฆฌ๋”๋ผ๋„ ํ•˜๋‚˜์˜ ์ •๋‹ต๋งŒ ์ฐพ์œผ๋ฉด ๋‚˜๋จธ์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ์ •๋‹ต์—์„œ ์ œ์™ธ
์‹œ๊ฐ„๋ณต์žก๋„๋†’๋‹ค๋‚ฎ๋‹ค

dfs-bfs


2. BFS (๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)

  • BFS (Breadth-First Search, ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)
  • ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ฐ™์€ ๊นŠ์ด์— ํ•ด๋‹นํ•˜๋Š” ์ •์ ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

2.1 BFS ํŠน์ง•

  • Queue๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‹œ์ž‘ ์ง€์ ์—์„œ ๊ฐ€๊นŒ์šด ์ •์ ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•œ๋‹ค.
  • V๊ฐ€ ์ •์ ์˜ ์ˆ˜, E๊ฐ€ ๊ฐ„์„ ์˜ ์ˆ˜์ผ ๋•Œ BFS์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(V+E)O(V+E)๋‹ค.

Data Structure_14_1

  1. ์‹œ์ž‘์ง€์ ์„ A๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ , Queue์— A๋ฅผ ์‚ฝ์ž…
  2. A๋กœ๋ถ€ํ„ฐ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„์„ ์„ ์ฒดํฌํ•˜์—ฌ, ํ•ด๋‹น ์ •์  B, C, D๋ฅผ Queue์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
  3. B ์ •์ ์„ Dequeueํ•˜์—ฌ, B๋กœ๋ถ€ํ„ฐ ์ด๋™๊ฐ€๋Šฅํ•œ ์ •์  F๋ฅผ Queue์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
    • ์ด๋–„ C๋Š” ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ณณ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  4. C ์ •์ ์„ Dequeueํ•˜์—ฌ, C๋กœ๋ถ€ํ„ฐ ์ด๋™๊ฐ€๋Šฅํ•œ ์ •์  F์ด์ง€๋งŒ, ์ด๋ฏธ Queue์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  5. D ์ •์ ์„ Dequeueํ•˜์—ฌ, D๋กœ๋ถ€ํ„ฐ ์ด๋™๊ฐ€๋Šฅํ•œ ์ •์  E๋ฅผ Queue์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
  6. F ์ •์ ์„ Dequeueํ•˜์—ฌ, F๋กœ๋ถ€ํ„ฐ ์ด๋™๊ฐ€๋Šฅํ•œ ์ •์  G๋ฅผ Queue์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
  7. G ์ •์ ์€ ๋” ์ด์ƒ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ •์ ์ด ์—†์Šต๋‹ˆ๋‹ค.
  8. ๊ทธ๋ž˜์„œ G ์ •์ ์„ Dequeueํ•˜๊ณ  ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

3. DFS (๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)

  • DFS (Depth-First Search, ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)
  • ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ตœ๋Œ€ํ•œ ๊นŠ์€ ์ •์ ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

3.1 DFS ํŠน์ง•

  • Stack๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‹œ์ž‘ ์ •์ ์—์„œ ๊นŠ์€ ๊ฒƒ๋ถ€ํ„ฐ ์ฐพ๋Š”๋‹ค.
  • V๊ฐ€ ์ •์ ์˜ ์ˆ˜, E๊ฐ€ ๊ฐ„์„ ์˜ ์ˆ˜์ผ ๋•Œ DFS์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(V+E)O(V+E)๋‹ค.

Data Structure_14_2

์ตœ์ƒ์œ„ ๋…ธํŠธ์—์„œ ์—ฐ๊ฒฐ๋œ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•œ ํ›„, ๋” ์ด์ƒ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†์„ ๋•Œ ์ธ์ ‘ํ•œ ์ƒ์œ„ ๋…ธ๋“œ์˜ ํ˜•์ œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ, ํ•ด๋‹น ํ˜•์ œ ๋…ธ๋“œ์—์„œ๋„ ์ž์‹ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ , ๋” ์ด์ƒ ์ž์‹๋…ธ๋“œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๋‹ค์‹œ ์ธ์ ‘ํ•œ ์ƒ์œ„ ํ˜•์ œ์˜ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ

  1. ์‹œ์ž‘์ง€์ ์„ A๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ , Stack์— A๋ฅผ ์‚ฝ์ž…
  2. Stack์˜ ํƒ‘์ธ A๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ, ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ •์  B๋ฅผ Stack์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
  3. Stack์˜ ํƒ‘์ธ B๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ, ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ •์  F๋ฅผ Stack์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
  4. Stack์˜ ํƒ‘์ธ F๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ, ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ •์  C๋ฅผ Stack์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
    • C์—์„œ๋Š” ๋” ์ด์ƒ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— pop์„ ์ˆ˜ํ–‰ํ•˜๊ณ ,
  5. ๋‹ค์‹œ Stack์˜ ํƒ‘์ธ F๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ, ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ •์  G๋ฅผ Stack์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
  6. G์—์„œ๋Š” ๋” ์ด์ƒ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— pop์„ ์ˆ˜ํ–‰ํ•˜๊ณ ,
    • ๋‹ค์‹œ F๋กœ ๋Œ์•„์™€๋„ F์—์„œ๋Š” ๋” ์ด์ƒ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— pop์„ ์ˆ˜ํ–‰ํ•˜๊ณ ,
    • ๋‹ค์‹œ B๋กœ ๋Œ์•„์™€๋„ B์—์„œ๋Š” ๋” ์ด์ƒ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— pop์„ ์ˆ˜ํ–‰ํ•˜๊ณ ,
    • ๋‹ค์‹œ A๋กœ ๋Œ์•„์˜ต๋‹ˆ๋‹ค.
  7. Stack์˜ ํƒ‘์ธ A๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ, ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ •์  D๋ฅผ Stack์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
  8. Stack์˜ ํƒ‘์ธ D๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ, ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ •์  E๋ฅผ Stack์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
  9. E์—์„œ ๋” ์ด์ƒ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— A๊นŒ์ง€ ๋‹ค์‹œ ๋Œ์•„๊ฐ€๊ณ , A์—์„œ๋„ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

4. ๋ฌธ์ œ : ํƒ€๊ฒŸ๋„˜๋ฒ„

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ณ ๋“์  Kit : ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Level 2 ํƒ€๊ฒŸ๋„˜๋ฒ„

  1. ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ณ„์‚ฐ : ์ตœ์•…์˜ ๊ฒฝ์šฐ ์ˆ˜ํ–‰ํ•  ์—ฐ์‚ฐ ํšŸ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด ์žฌ๊ท€ํ•จ์ˆ˜/์™„์ „ํƒ์ƒ‰์„ ์‚ฌ์šฉํ• ์ง€ ํ™•์ธ
  2. ์ˆ˜ํ–‰๋™์ž‘ : ์žฌ๊ท€ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋์„ ๋–„ 1ํ„ด๋งˆ๋‹ค ์ˆ˜ํ–‰ํ•  ๋™์ž‘ ๊ตฌํ˜„
  3. ํƒˆ์ถœ์กฐ๊ฑด : ์–ด๋А ์‹œ์ ์— ์ด ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ๋Š์„์ง€ ๊ตฌํ˜„

numbers์˜ 0๋ฒˆ์งธ ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰๊นŒ์ง€ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๊ฐ๊ฐ ๋ง์…ˆ ๋˜๋Š” ๋บ„์…ˆํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•˜์—ฌ target๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๊ธฐ

1
/** https://school.programmers.co.kr/learn/courses/30/lessons/43165?language=javascript
2
* numbers ๋ฐฐ์—ด์„ ๊ฐ๊ฐ ๋”ํ•˜๊ฑฐ๋‚˜ ๋นผ์„œ ๋ชฉํ‘œํ•˜๋Š” target ์ˆซ์ž ๋งŒ๋“œ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ตฌํ•˜๊ธฐ
3
* @param {*} numbers ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ˆซ์ž
4
* @param {*} target ํƒ€๊ฒŸ ๋„˜๋ฒ„
5
* @returns target ์ˆซ์ž ๋งŒ๋“œ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜
6
* numbers์˜ ๊ฐ ์ž๋ฆฌ์˜ ์ˆซ์ž๋ฅผ ๋”ํ•˜๊ฑฐ๋‚˜ ๋นผ๋Š” ๊ฒฝ์šฐ๊ฐ€ 2
7
* ์ฃผ์–ด์ง€๋Š” ์ˆซ์ž ์ตœ๋Œ€ ๊ฐœ์ˆ˜๊ฐ€ 20๊ฐœ
8
* ๊ทธ 20๊ฐœ์˜ ์ˆซ์ž์— ๋Œ€ํ•ด ๊ฐ๊ฐ 2๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์กด์žฌ
9
* 2์˜ 20์Šน์ธ 100๋งŒ๋ฒˆ ์ •๋„๊ฐ€ ์ตœ์•…์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜
10
*/
11
function solution(numbers, target) {
12
let answer = 0
13
const length = numbers.length
14
15
DFS(0, 0) //ํ•จ์ˆ˜ ํ˜ธ์ถœ (0๋ฒˆ์งธ ์ˆซ์ž, ํ˜„์žฌ๊นŒ์ง€ ํ•ฉ๊ณ„ 0)
16
return answer
17
18
// numbers์˜ ์ธ๋ฑ์Šค์™€ ํ˜„์žฌ๊นŒ์ง€์˜ ํ•ฉ๊ณ„
19
function DFS(index, sum) {
20
// **** 1. ํƒˆ์ถœ ์กฐ๊ฑด
21
// numbers์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ–ˆ๋‹ค๋ฉด
22
if (index === length) {
23
// ํ˜„์žฌ๊นŒ์ง€์˜ ํ•ฉ๊ณ„๊ฐ€ target์ด๋ฉด answer++
24
if (target === sum) {
25
answer++
26
}
27
return
28
}
29
30
// **** 2. ์ˆ˜ํ–‰๋™์ž‘
31
// ๋ชจ๋“  ์ˆซ์ž๊ฐ€ (+)์ธ ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•œ ๋’ค
32
// ๋‹ค์Œ ์ธ๋ฑ์Šค์˜ ์ˆซ์ž๊ฐ€ (-)์ธ ๊ฒฝ์šฐ๋ฅผ ํƒ์ƒ‰
33
DFS(index + 1, sum + numbers[index])
34
DFS(index + 1, sum - numbers[index])
35
}
36
}

4.1 ์ˆ˜ํ–‰๋™์ž‘

numbers๋Š” [1,1,1,1,1]์ด, target์ด 3์ธ ๊ฒฝ์šฐ

Data Structure_14_3

(1) DFS(index + 1, sum + numbers[index]) ๋ถ€๋ถ„์ด ๊ณ„์† ์‹คํ–‰๋˜๋ฉฐ ๋‹ค์Œ ์ธ๋ฑ์Šค์˜ ์ˆซ์ž๊ฐ€ (+) ์ธ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ณ„์† ํƒ์ƒ‰


Data Structure_14_4

(2) ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์— ๋‹ค๋‹ค๋ž์„ ๊ฒฝ์šฐ(index = 5, sum = 5 ์ผ ๋•Œ) ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์Šคํƒ์—์„œ ์ œ๊ฑฐํ•œ ๋’ค, index๊ฐ€ 4์ผ ๋•Œ DFS(index + 1, sum - numbers[index]) ์„ ์‹คํ–‰ํ•˜์—ฌ (-)์ธ ์ž์‹ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰


Data Structure_14_5

(3) ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค์— ๋‹ค๋‹ค๋ž์œผ๋‹ˆ ๋‹ค์‹œ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์Šคํƒ์—์„œ ์ œ๊ฑฐ, index๊ฐ€ 3์ผ ๋•Œ DFS(index + 1, sum โ€” numbers[index]) ์„ ์‹คํ–‰


Data Structure_14_6

(4) index 4๊ฐ€ (-)์ผ ๋•Œ DFS(index + 1, sum + numbers[index])์„ ์‹คํ–‰ํ•˜์—ฌ index 5๊ฐ€ (+)์ธ ๊ฒฝ์šฐ์˜ ์ž์‹์„ ํƒ์ƒ‰, ํƒ์ƒ‰์„ ๋งˆ์น˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์Šคํƒ์—์„œ ์ œ๊ฑฐํ•œ ๋’ค DFS(index + 1, sum - numbers[index])์„ ์‹คํ–‰ํ•˜์—ฌ index 5๊ฐ€ (-)์ธ ๊ฒฝ์šฐ์˜ ์ž์‹์„ ํƒ์ƒ‰


(5) ๋‹ค์‹œ index๊ฐ€ 2์ผ ๋•Œ DFS(index + 1, sum + numbers[index])์„ ์‹คํ–‰, index 3์ด (-)์ผ ๋•Œ DFS(index + 1, sum + numbers[index])์„ ์‹คํ–‰ํ•˜์—ฌ index 4๊ฐ€ (+)์ธ ๊ฒฝ์šฐ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ ํ›„ 15๋ฒˆ ๋ผ์ธ์„ ์‹คํ–‰ํ•˜๋ฉฐ index 5๊ฐ€ (-)์ธ ๊ฒฝ์šฐ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰


(+)์˜ ์ž์‹ ๋…ธ๋“œ ํƒ์ƒ‰ โ†’ (-)์˜ ์ž์‹ ๋…ธ๋“œ ํƒ์ƒ‰ ์ˆœ์„œ๋กœ ์œ„ ๊ณผ์ •์ด ์ง„ํ–‰๋˜๋ฉฐ, index 1์ด (-)์ผ ๋•Œ์˜ ์ž์‹ ๋…ธ๋“œ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜ (+), (-) ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ


4.2 ํ’€์ด ๋ฆฌํŒฉํ† ๋ง

1
/** https://school.programmers.co.kr/learn/courses/30/lessons/43165?language=javascript
2
* numbers ๋ฐฐ์—ด์„ ๊ฐ๊ฐ ๋”ํ•˜๊ฑฐ๋‚˜ ๋นผ์„œ ๋ชฉํ‘œํ•˜๋Š” target ์ˆซ์ž ๋งŒ๋“œ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ตฌํ•˜๊ธฐ
3
* @param {*} numbers ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ˆซ์ž
4
* @param {*} target ํƒ€๊ฒŸ ๋„˜๋ฒ„
5
* @returns
6
* numbers์˜ ๊ฐ ์ž๋ฆฌ์˜ ์ˆซ์ž๋ฅผ ๋”ํ•˜๊ฑฐ๋‚˜ ๋นผ๋Š” ๊ฒฝ์šฐ๊ฐ€ 2
7
* ์ฃผ์–ด์ง€๋Š” ์ˆซ์ž ์ตœ๋Œ€ ๊ฐœ์ˆ˜๊ฐ€ 20๊ฐœ
8
* ๊ทธ 20๊ฐœ์˜ ์ˆซ์ž์— ๋Œ€ํ•ด ๊ฐ๊ฐ 2๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์กด์žฌ
9
* 2์˜ 20์Šน์ธ 100๋งŒ๋ฒˆ ์ •๋„๊ฐ€ ์ตœ์•…์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜
10
*/
11
function solution(numbers, target) {
12
function DFS(index, sum) {
13
if (index === numbers.length) return sum === target ? 1 : 0
14
return DFS(index + 1, sum + numbers[index]) + DFS(index + 1, sum - numbers[index])
15
}
16
return DFS(0, 0)
17
}

5. ๋ฌธ์ œ : ๊ฒŒ์ž„ ๋งต ์ตœ๋‹จ๊ฑฐ๋ฆฌ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ณ ๋“์  Kit : ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Level 2 ๊ฒŒ์ž„ ๋งต ์ตœ๋‹จ๊ฑฐ๋ฆฌ

  1. ๊ฒŒ์ž… ๋งต์—์„œ ์šฐ์ธก ํ•˜๋‹จ์˜ ์ƒ๋Œ€๋ฐฉ ์ง„์˜์˜ ์œ„์น˜๋ฅผ ํ™•์ธํ•œ๋‹ค.
  2. ๊ฒŒ์ž„ ์บ๋ฆญํ„ฐ๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉํ–ฅ์„ฑ์„ ์ˆ˜์น˜ํ™”ํ•œ๋‹ค.
  3. ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS)์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ํ˜„์žฌ ํ™•์ธํ•œ ์œ„์น˜๋ฅผ ๋‹ด์„ Queue๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  4. ๊ฒŒ์ž„ ์บ๋ฆญํ„ฐ๊ฐ€ ์ตœ์ดˆ ์œ„์น˜ํ•˜๊ณ  ์žˆ๋Š” ์ง€์ ์„ Queue์— ์ž…๋ ฅํ•œ๋‹ค.
  5. BFS๋ฅผ ํ†ตํ•ด ์‹œ์ž‘์ง€์ ์—์„œ๋ถ€ํ„ฐ ์ƒ๋Œ€๋ฐฉ ์ง„์˜๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ๋‹ค.
    • ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ๋Š” ๋ชจ๋“  ์ง€์—ญ์„ ๊นŠ์ด ์žˆ๊ฒŒ ํ›‘์–ด๋ด์•ผํ•˜๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(DFS)๋ณด๋‹ค
    • ํ˜„์žฌ ์œ„์น˜์—์„œ๋ถ€ํ„ฐ ๊ฐ€๊นŒ์šด ์œ„์น˜๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๋„“๊ฒŒ ๊ฑฐ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์ง
1
function solution(maps) {
2
let answer = -1
3
const X_LEN = maps.length // maps์˜ ํ–‰
4
const Y_LEN = maps[0].length // maps์˜ ์—ด
5
const DIRECTION = [
6
[1, 0], // ์ƒ
7
[0, 1], // ์šฐ
8
[-1, 0], // ํ•˜
9
[0, -1], // ์ขŒ
10
]
11
12
// // BFS์— ์‚ฌ์šฉํ•  queue๋ฅผ ์ƒ์„ฑ
13
const mapsQueue = []
14
15
maps[0][0] = 0 // ์‹œ์ž‘ ์œ„์น˜
16
17
// ์ฒซ ์‹œ์ž‘์€ ๋ฌด์กฐ๊ฑด ๊ฐ€์žฅ ์ขŒ์ธก์˜ ๊ฐ€์žฅ ์ƒ๋‹จ์—์„œ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ
18
// 0, 0 ์ขŒํ‘œ์™€ ์ด๋™ํ•œ ์นธ ์ˆ˜ ๊นŒ์ง€ ํ•ด์„œ [0, 0, 1]
19
mapsQueue.push([0, 0, 1])
20
21
while (mapsQueue.length > 0) {
22
const [x, y, distance] = mapsQueue.shift()
23
24
if (x === X_LEN - 1 && y === Y_LEN - 1) {
25
answer = distance
26
break
27
}
28
29
for (let i = 0; i < DIRECTION.length; i++) {
30
const [nextX, nextY] = [x + DIRECTION[i][0], y + DIRECTION[i][1]]
31
if (nextX < 0 || nextX >= X_LEN || nextY < 0 || nextY >= Y_LEN || maps[nextX][nextY] === 0) {
32
continue
33
}
34
35
maps[nextX][nextY] = 0
36
mapsQueue.push([nextX, nextY, distance + 1])
37
}
38
}
39
40
return answer
41
}