Skip to content

Latest commit

ย 

History

History
57 lines (41 loc) ยท 2.31 KB

Backtracking.md

File metadata and controls

57 lines (41 loc) ยท 2.31 KB

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

๋ฐฑํŠธ๋ž˜ํ‚น(Backtracking) ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ•ด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ ์„ ํƒ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์‹œ๋„ํ•˜๋ฉฐ, ์„ ํƒํ•œ ๊ฒฝ๋กœ๊ฐ€ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ์ด์–ด์ง€์ง€ ์•Š์œผ๋ฉด ์ด์ „ ๋‹จ๊ณ„๋กœ ๋Œ์•„๊ฐ€์„œ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋ฅผ ์‹œ๋„ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฑํŠธ๋ž˜ํ‚น ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(DFS, Depth First Search)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

โ—ํŠน์ง•

image

  1. ์ œ์•ฝ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ชจ๋“  ํ•ด๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.
  2. ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์‹œ๋„ํ•˜๋ฉฐ, ์ผ๋‹จ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ์ด์–ด์ง€์ง€ ์•Š์œผ๋ฉด ์ด์ „ ๋‹จ๊ณ„๋กœ ๋Œ์•„๊ฐ€์„œ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ฌธ์ œ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋ถˆํ•„์š”ํ•œ ๊ณ„์‚ฐ์ด ๋งŽ์•„์ง€๊ธฐ ๋•Œ๋ฌธ์—, ์ ์ ˆํ•œ ๊ฐ€์ง€์น˜๊ธฐ(pruning) ๊ธฐ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ฐฑํŠธ๋ž˜ํ‚น์€ ๋ถˆํ•„์š”ํ•œ ํƒ์ƒ‰์„ ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์—์„œ, ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ๋Š” ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

โ€ป ๊ฐ€์ง€์น˜๊ธฐ๋ฅผ ์–ผ๋งˆ๋‚˜ ์ž˜ํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ํ˜ธ์œจ์„ฑ์ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

โ—๋ฐฑํŠธ๋ž˜ํ‚น ์•Œ๊ณ ๋ฆฌ์ฆ˜

Backtrack(x)
    if x is not a solution
        return false
    if x is a new solution
        add to list of solutions
    backtrack(expand x)

๐Ÿ“Œ ์˜ˆ์ œ (Baekjoon)

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

๋ฌธ์ œ image

ํ’€์ด

์ด ๋ฌธ์ œ๋Š” n๊ฐœ์˜ ์ž์—ฐ์ˆ˜ ์ค‘์—์„œ ์ค‘๋ณต ์—†์ด m๊ฐœ๋ฅผ ๊ณ ๋ฅด๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

combinations ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐํ•ฉ์œผ๋กœ ์‰ฝ๊ฒŒ ํ’€์ด๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ,
๋ฐฑํŠธ๋ž˜ํ‚น์„ ์ด์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ(Python)

n, m = map(int, input().split())

def backtracking(selected, depth):
    # ๊ฐœ์ˆ˜๊ฐ€ m๊ณผ ๊ฐ™์œผ๋ฉด ์ถœ๋ ฅ
    if depth == m:
        print(' '.join(map(str, selected)))
        return
    
    # ํ˜„์žฌ๊นŒ์ง€ ์„ ํƒํ•œ ์ˆซ์ž๋“ค ์ค‘ ๊ฐ€์žฅ ํฐ ์ˆซ์ž๋ณด๋‹ค ํฐ ์ˆซ์ž๋“ค๋งŒ ์„ ํƒ
    start = selected[-1] + 1 if selected else 1
    for i in range(start, n+1):
        backtracking(selected + [i], depth + 1)

backtracking([], 0)