Algorithm/BFS & DFS

[Algorithm] ๋ฐฑํŠธ๋ž™ํ‚น / DFS ์ฐจ์ด - ์• ๋งค๋ชจํ˜ธํ•œ ๊ฐœ๋… ๋‹ค์žก๊ธฐ

ํ”„๋กœ๊ทธ๋ž˜๋จธ ์˜ค์›” 2023. 10. 27.

 

์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋ฌธ์ œ๋ฅผ ํ’€๋‹ค๋ณด๋ฉด DFS ์™€ ๋ฐฑํŠธ๋ ˆํ‚น์˜ ๋‹จ์–ด๋ฅผ ํ˜ผ์šฉํ•ด ๊ฐ€๋ฉฐ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๋ชจ์Šต์„ ์Šค์Šค๋กœ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค. DFS๋„ ๊ฐœ๋…์ ์œผ๋กœ ์•Œ๊ณ , ๋ฐฑํŠธ๋ž˜ํ‚น๋„ ๋А๋‚Œ์ ์œผ๋กœ ์•Œ๊ณ  ์žˆ๋Š”๋ฐ, ์ด ๋‘˜์˜ ์ฐจ์ด๊ฐ€ ์กฐ๊ธˆ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊นจ๋‹ฌ์•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๋งŽ์ด ํ˜ผ๋™ํ•ด ๊ฐ€๋ฉฐ ์“ฐ๋Š” ๊ฐœ๋…๋“ค์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋‹ค์žก์•„ ๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

 

๐ŸŽฏDFS & Backtracking

 

๋จผ์ € ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” DFS ์™€ ๋ฐฑํŠธ๋ž™ํ‚น ๊ฐœ๋… ๋ง๊ณ  ์‹ค์ œ ์˜คํ”ผ์…œ๋กœ ์ •ํ•ด์ง„ ๊ฐœ๋…์ด๋‹ค.

  1. ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ (DFS):
    • DFS๋Š” ๊ทธ๋ž˜ํ”„๋‚˜ ํŠธ๋ฆฌ์™€ ๊ฐ™์€ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.
    • ์‹œ์ž‘ ๋…ธ๋“œ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ๋‹ค์Œ ๋ถ„๊ธฐ๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์ „์— ํ˜„์žฌ ๋ถ„๊ธฐ๋ฅผ ์™„์ „ํžˆ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
    • DFS๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋ž˜ํ”„์—์„œ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ์ผ๋ฐ˜์ ์œผ๋กœ ์Šคํƒ์ด๋‚˜ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.
  2. ๋ฐฑํŠธ๋ž˜ํ‚น (Backtracking):
    • ๋ฐฑํŠธ๋ž˜ํ‚น์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํ›„๋ณด ํ•ด๊ฒฐ์ฑ…์„ ์กฐ์‚ฌํ•˜๋ฉด์„œ, ์–ด๋–ค ํ›„๋ณด๊ฐ€ ํ˜„์žฌ์˜ ๋ฌธ์ œ์˜ ํ•ด๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด ํ•ด๋‹น ํ›„๋ณด๋ฅผ ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.
    • ๋ฐฑํŠธ๋ž˜ํ‚น์€ ์ฃผ๋กœ ์กฐํ•ฉ, ์ˆœ์—ด, ๋ถ€๋ถ„ ์ง‘ํ•ฉ, ์Šค๋„์ฟ , N-ํ€ธ ๋ฌธ์ œ์™€ ๊ฐ™์ด ๊ฒฐ์ • ๋ฌธ์ œ(Decision Problem)๋‚˜ ์ตœ์ ํ™” ๋ฌธ์ œ(Optimization Problem)์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ๋ฐฑํŠธ๋ž˜ํ‚น์€ DFS๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์•ฝํ•˜๋ฉด, ๋ฐฑํŠธ๋ž˜ํ‚น์€ ๋ฌธ์ œ์˜ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ํ›„๋ณด๋ฅผ ์กฐ์‚ฌํ•˜๋ฉด์„œ ์ตœ์ ํ•ด๋‚˜ ๋ฌธ์ œ์˜ ๋‹ต์„ ์ฐพ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๋ฉฐ, DFS๋Š” ๊ทธ๋ž˜ํ”„๋‚˜ ํŠธ๋ฆฌ์™€ ๊ฐ™์€ ์ž๋ฃŒ ๊ตฌ์กฐ์—์„œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. DFS๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น์˜ ์ผ๋ถ€ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฐฑํŠธ๋ž˜ํ‚น์€ ๋ณด๋‹ค ์ผ๋ฐ˜์ ์œผ๋กœ ์ตœ์ ํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ „๋žต์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

์œ„ ์„ค๋ช…์„ ๋ณด๋ฉด ๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋Š” ๋‚ฎ์€ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๊ทธ๋ฆฌ๊ณ  ๋‚ฎ์€ ๊ณต๊ฐ„ ๋ณต์žก๋„ ๊ทธ๋ฆฌ๊ณ  ๋†’์€ ํšจ์œจ์„ฑ์„ ๊ฐ€์ง€๋Š” ์ •๋‹ต์„ ์ฐพ์•„์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ DFS ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€๋•Œ ํ•ด๋‹น๋ถ„๊ธฐ๊ฐ€ ์ •๋‹ต ํ›„๋ณด์ง€์—์„œ ํƒˆ๋ฝ ํ•˜๋ฉด ๊ทธ ๋ถ„๊ธฐ์˜ ์ž์‹ ๋…ธ๋“œ๋“ค์€ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— Cut - edge (์ปท์—ฃ์ง€)๋ผ๋Š” ๊ฑธ ํ†ตํ•ด ๊ฐ€์ง€์น˜๊ธฐ๋ฅผ ํ•˜๊ณ  ๋‹ค์Œ ๋ถ„๊ธฐ๋ฅผ ํ™•์ธํ•˜๋Š” ๋กœ์ง์„ ๋งŽ์ด ์“ด๋‹ค. 

ํ•˜์ง€๋งŒ, DFS ๋Š” ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์„ ๋ฐฉ๋ฌธํ•˜์—ฌ ์ •๋‹ต์„ ์ฐพ๋Š” ์™„์ „ ํƒ์ƒ‰์— ๊ฐ€๊น๊ณ , DFS + Cut - edge๋ฅผ ์“ฐ๋Š” ๋ฐฉ์‹์ด ๋ฐ”๋กœ ๋ฐฑํŠธ๋ž˜ํ‚น์ด์—ˆ๋˜ ๊ฒƒ์ด๋‹ค.

 

 

์•„๋‹ˆ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค.

 

 

 

๐Ÿ…ฑ๏ธ๐Ÿ”™ ๋ฐฑํŠธ๋ž˜ํ‚น - Backtracking

 

๊ทธ๋Ÿฌ๋ฉด ๋ฐฑํŠธ๋ž˜ํ‚น(Backtracking)์€ 'ํ•ด๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋‹ค์‹œ ๋Œ์•„์˜จ๋‹ค ๋˜๋Š” ๋ฒ„๋ฆฐ๋‹ค'๊ณ  ์–ธ๊ธ‰ํ–ˆ๋Š”๋ฐ, ์ด ๋ถ€๋ถ„์„ ๊ฐ€์ง€์น˜๊ธฐ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์ฆ‰ ๋ถˆํ•„์š”ํ•œ ๊ฒฝ๋กœ๋Š” ๊ตณ์ด ๋๊นŒ์ง€ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ง๊ด€์ ์œผ๋กœ ๋ด๋„ ๋ฐฑํŠธ๋ž˜ํ‚น์˜ ํšจ์œจ์„ฑ์€ ์–ผ๋งˆ๋‚˜ ๊ฐ€์ง€์น˜๊ธฐ๋ฅผ ์ ์ ˆํžˆ ํ•ด๋‚ด๋А๋ƒ์˜ ๋ฌธ์ œ๋กœ ๋ณผ ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿผ ๋ฐฑํŠธ๋ž™ํ‚น์˜ ์šฉ์–ด ๋˜ํ•œ ํ•œ ๋ฒˆ ๋ณด๊ณ  ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค.

  • ์œ ๋งํ•จ(promising): ์ง„ํ–‰์ค‘์ธ ๊ฒฝ๋กœ๊ฐ€ ํ•ด๋‹ต์„ ์ฐพ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ
  • ์œ ๋งํ•˜์ง€ ์•Š์Œ(nopromising): ์ง„ํ–‰์ค‘์ธ ๊ฒฝ๋กœ๊ฐ€ ํ•ด๋‹ต์„ ์ฐพ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์—†์Œ
  • ๊ฐ€์ง€์น˜๊ธฐ(pruning): ์œ ๋งํ•˜์ง€ ์•Š์€ ํ•˜์œ„ ํŠธ๋ฆฌ๋ฅผ ์ž˜๋ผ๋ƒ„

 

๐Ÿ’ก๋‚ด๊ฐ€ ํ˜ผ๋™ํ•˜๋ฉฐ ์“ฐ๋˜ Cut - edge ๋ผ๋Š” ๊ฒƒ์€ ๊ฐ€์ง€์น˜๊ธฐ๋กœ ์›๋ž˜ ๊ฐœ๋…๋Œ€๋กœ๋ผ๋ฉด pruning ์ด์—ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ ํ’€์ด๋ฅผ ๋ฐฑํŠธ๋ ˆํ‚น์œผ๋กœ ํ’€๊ณ  ์žˆ๋˜ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ DFS๋ฅผ ์จ์„œ ์œ ๋งํ•˜์ง€ ์•Š์€ ๊ฐ€์ง€๋ฅผ ์ž๋ฅด๋Š” ๋กœ์ง ๋งŒ ์กฐ๊ธˆ ์ถ”๊ฐ€ํ•˜๋ฉด ๋˜๋‹ˆ ๋งŽ์€ ๋ฌธ์ œ๋“ค์ด ๊ทธ๋ƒฅ DFS ๋ฌธ์ œ๋กœ ์ฃผ์ œ๋ฅผ ์ •ํ•ด ๋‘” ๊ฒƒ ๊ฐ™๋‹ค.

 

DFS๋ฅผ ์‚ฌ์šฉํ•œ ์™„์ „ ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•œ ํ’€์ด์™€ ๋ฐฑํŠธ๋ž™ํ‚น์„ ์‚ฌ์šฉํ•œ ์ตœ์ ์˜ ๋‹ต์„ ๊ตฌํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์ฝ”ํ…Œ ๋ฌธ์ œ๋ฅผ ๋ช‡๊ฐ€์ง€ ์†Œ๊ฐœํ•˜๊ฒ ๋‹ค.

 

 

๐Ÿ“œ์˜ˆ์‹œ๋ฌธ์ œ

 

DFS

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ํ”ผ๋กœ๋„

https://school.programmers.co.kr/learn/courses/30/lessons/87946

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๋ฌด์ธ๋„ ์—ฌํ–‰

https://school.programmers.co.kr/learn/courses/30/lessons/154540

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

๋ฐฑํŠธ๋ž™ํ‚น ( Backtracking )

 

๋ฐฑ์ค€ - N๊ณผ M

https://www.acmicpc.net/problem/15650

 

15650๋ฒˆ: N๊ณผ M (2)

ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ๋ฌธ์ œ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ˆ˜์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค. ์ค‘๋ณต๋˜๋Š” ์ˆ˜์—ด์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ถœ๋ ฅํ•˜๋ฉด ์•ˆ๋˜๋ฉฐ, ๊ฐ ์ˆ˜์—ด์€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. ์ˆ˜์—ด์€ ์‚ฌ์ „ ์ˆœ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์„œ๋กœ ์ถœ๋ ฅํ•ด

www.acmicpc.net

 

๋ฐฑ์ค€ - N-Queen

https://www.acmicpc.net/problem/9663

 

9663๋ฒˆ: N-Queen

N-Queen ๋ฌธ์ œ๋Š” ํฌ๊ธฐ๊ฐ€ N × N์ธ ์ฒด์ŠคํŒ ์œ„์— ํ€ธ N๊ฐœ๋ฅผ ์„œ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋†“๋Š” ๋ฌธ์ œ์ด๋‹ค. N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ํ€ธ์„ ๋†“๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

www.acmicpc.net

 

 

์ฐธ๊ณ 

https://kwanik.tistory.com/34 

 

'Algorithm > BFS & DFS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Algorithm] DFS ์™€ ์žฌ๊ท€ ํ•จ์ˆ˜( Recursive Function )  (0) 2023.10.31

๋Œ“๊ธ€