๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm Study

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

by DUSTIN KANG 2024. 4. 16.

๐ŸŒฑ ๋ฐฑํŠธ๋ž˜ํ‚น

๋ฐฑํŠธ๋ž˜ํ‚น(BackTracking)์€ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋„๋Š” ์•„๋‹ˆ๋ผ ์ผ์ข…์˜ ๊ธฐ๋ฒ•, ์ „๋žต์ž…๋‹ˆ๋‹ค. ๋ฐฑํŠธ๋ž˜ํ‚น(Backtracking, ํ‡ด๊ฐ ๊ฒ€์ƒ‰)์€ ์ผ์ข…์˜ ํ•ด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์žฌ๊ท€์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋‚˜๊ฐ€๋‹ค๊ฐ€ ์ œ์•ฝ ์กฐ๊ฑด์— ์œ„๋ฐฐ๊ฐ€ ๋œ๋‹ค๋ฉด ์ œ์™ธ ํ‘œ์‹œ๋ฅผ ํ•˜๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

๊ฒฐ๋ก ์ ์œผ๋กœ, ๋ฐฑํŠธ๋ž˜ํ‚น ๊ธฐ๋ฒ•์€ ์ œ์•ฝ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— DFS์™€ BFS์™€ ๊ฐ™์€ ์™„์ „ ํƒ์ƒ‰ ๊ธฐ๋ฒ•์œผ๋กœ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ํŠน์„ฑ์ƒ ์ œ์•ฝ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์‹œ ์ด์ „ ๋…ธ๋“œ๋กœ ๋Œ์•„์™€์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— BFS๋ณด๋‹ค๋Š” DFS๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ํŽธํ•ฉ๋‹ˆ๋‹ค.๋ฌผ๋ก  ์‹œ๊ฐ„์ด ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ์—” BFS๋กœ ํ’€์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ์ œ์•ฝ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋ฃจํŠธ๋กœ ๋Œ์•„๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„  Promising์ด๋ผํ•˜๊ณ  ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜์ง€ ์•Š์•„ ๋‹ค๋ฅธ ๋ฃจํŠธ๋กœ ๊ฐ€๋Š” ๊ฒƒ์„ ๊ฐ€์น˜์น˜๊ธฐ(Pruning)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, DFS๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์ œ์•ฝ ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๊ฐ€์ง€์น˜๊ธฐ(Pruning)๋กœ ์ œ์™ธ์‹œํ‚ค๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ฐฑ ํŠธ๋ž˜ํ‚น ๋ฌธ์ œ ํ’€์ด(N-Queen)

๋‹ค์Œ N-Queen ๋ฌธ์ œ๋ฅผ ๋ด…์‹œ๋‹ค.

 

NXN ํฌ๊ธฐ์˜ ์ฒด์Šค ๋ณด๋“œ ์œ„์— ํ€ธ N๊ฐœ๋ฅผ ์„œ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋†“๋Š” ๋ฌธ์ œ์ด๋‹ค.

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

  • ์ž…๋ ฅ : ์ฒซ์งธ ์ค„์— N์ด ์ฃผ์–ด์ง„๋‹ค. (1 <= N < 15) ex) `8`
  • ์ถœ๋ ฅ : ์ฒซ์งธ ์ค„์— ํ€ธ N๊ฐœ๋ฅผ ์„œ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋†“๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ex) `92`

์—ฌ๊ธฐ์„œ Queen์„ ๋†“์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋Œ€๊ฐ์„ ์˜ ๊ฒฝ์šฐ์™€ ๋ฐ”๋กœ ์œ„์— ํ€ธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

 

๋จผ์ €, ์ด๋ฒˆ ๋ฌธ์ œ์—์„œ๋Š” ๊ตณ์ด ์ด์ฐจ์› ๋ฐฐ์—ด๊นŒ์ง€ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํ–‰(Row)์˜ ํ€ธ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ํŒ๋ณ„ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ œ์•ฝ์กฐ๊ฑด์ธ ๋Œ€๊ฐ์„ ๊ณผ ๋ฐ”๋กœ ์œ„์— ์žˆ์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ ํ–‰(row)์œผ๋กœ ๋„˜์–ด๊ฐ€๋„ ๋˜๊ณ  ์žˆ์œผ๋ฉด ๋‹ค์Œ ์—ด๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

๋‹ค์Œ ๊ทธ๋ฆผ ์ฒ˜๋Ÿผ, ํ€ธ์„ ์ฒซ๋ฒˆ์งธ ํ–‰์˜ ์ฒซ๋ฒˆ์งธ ์—ด์— ๋‘”๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. ์ฒซ๋ฒˆ์งธ ์—ด์€ ๊ทธ๋ƒฅ ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋‹ค์Œ ํ–‰์˜ ๊ฒฝ์šฐ๋Š” ์–ด๋–จ๊นŒ์š”?

๋‹ค์Œ ํ–‰์˜ ๊ฒฝ์šฐ ๊ฐ™์€ ํ–‰์— ํ€ธ์„ ๋‘”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๋ฐ”๋กœ ์œ„์— ํ€ธ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋†“์„ ์ˆ˜ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋‹ค์Œ ์—ด์— ๋‘์–ด์•ผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋‹ค๋ณด๋ฉด ์–ธ์  ๊ฐ„ X๊ฐ€ N๊นŒ์ง€ ๋„์ฐฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ํ•˜๋‚˜ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์‹œ ์žฌ๊ท€์ ์œผ๋กœ ์ง„ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

def check(x):
    """
    x๋ฒˆ์งธ ํ–‰์— QUEEN์„ ๋‘์–ด๋„ ๊ดœ์ฐฎ์€์ง€ ํ™•์ธ
    """
    # ๊ฐ ์ด์ „ ํ–‰๋“ค(i)๊ณผ ํ˜„์žฌํ–‰(x) ํ•˜๋‚˜์”ฉ ํ™•์ธ
    for i in range(x):
        # ์œ„์ชฝ ํ–‰์— ๋‹ค๋ฅธ ํ€ธ์ด ๋†“์—ฌ ์žˆ์œผ๋ฉด False ๋ฐ˜ํ™˜
        if row[x] == row[i]:
            return False
        # ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ ๊ฒน์น˜๋Š”๊ฒŒ ์žˆ๋‹ค๋ฉด False ๋ฐ˜ํ™˜
        if abs(row[x] - row[i]) == x - i:
            return False
    return True

def dfs(x):
    """
    `x`๋ฒˆ์งธ ํ–‰์— ๋Œ€ํ•ด ์ฒ˜๋ฆฌ (์ฒซ๋ฒˆ์จฐ ํ–‰ ๋ถ€ํ„ฐ)
    - n๋ฒˆ์งธ ํ–‰ ๊นŒ์ง€ ๋ชจ๋‘ ํ€ธ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—” `result += 1`
        - ๋ชจ๋“  ํ–‰์— ๋Œ€ํ•ด ๊ณ„์‚ฐ

    - x ๋ฒˆ์งธ์˜ ํ–‰์˜ ๊ฐ ์—ด(0 ~ N-1)์— ํ€ธ์„ ๋‘”๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. 
        - ํ•ด๋‹น ์œ„์น˜์— Queen์„ ๋‘์–ด๋„ ๊ดœ์ฐฎ์œผ๋ฉด ๋‹ค์Œ ํ–‰์œผ๋กœ ๋„˜์•„๊ฐ„๋‹ค.

    """
    global result
    if x == n:
        result += 1
    else:
        for i in range(n):
            # ์šฐ์„ , Queen์„ ๋‘์—ˆ๋‹ค๊ณ  ๊ฐ€์ •
            row[x] = i
            # ํ•ด๋‹น ์œ„์น˜์— ํ€ธ์„ ๋‘์–ด๋„ ๊ดœ์ฐฎ์€์ง€ `check(x)`
            if check(x):
                dfs(x + 1) # ๋†“์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‹ค์Œํ–‰์œผ๋กœ

n = int(input())
row = [0] * n # ํ–‰์˜ ๋Œ€ํ•œ ์ •๋ณด
result = 0
dfs(0)
print(result)

 


๐Ÿš€ ์•”ํ˜ธ๋งŒ๋“ค๊ธฐ ๋ฌธ์ œ

[๋ฐฑ์ค€1759] - ์•”ํ˜ธ๋งŒ๋“ค๊ธฐโ†—

 

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ๋ช‡๊ฐ€์ง€ ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š” ์•”ํ˜ธ๋“ค์„ ๋งŒ๋“œ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

  • ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ž์Œ๊ณผ ํ•œ๊ฐœ ์ด์ƒ์˜ ๋ชจ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.
  • ๋ฌธ์ž๊ฐ€ ์‚ฌ์ „์‹ ์ˆœ์„œ๋Œ€๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

๋จผ์ €, 4๊ธ€์ž์˜ ์•”ํ˜ธ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋ฌธ์ž์—ด์„ ์ •๋ ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด์œ ๋Š” ์‚ฌ์ „์‹ ์ˆœ์„œ๋Œ€๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  1๊ฐœ ์ด์ƒ์˜ ์ž์Œ์ด ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— `vowels`๋ผ๋Š” ์ž์Œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

vowels = ['a', 'e', 'i', 'o', 'u'] # ์ตœ์†Œ ํ•œ๊ฐœ์˜ ๋ชจ์Œ
l, c = map(int, input().split(" "))
words = [i for i in input().split(" ")]
words.sort()

 

์‹ค์ œ๋กœ ๋ฐฐ์—ด์— ๋ฌธ์ž๋ฅผ ๋„ฃ๊ณ  ์•ž ๋ฌธ์ž๊ฐ€ ํ˜„์žฌ ๋ฌธ์ž๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ์—๋งŒ ์•”ํ˜ธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ๋ฌธ์ž๋Š” ์‚ฌ์ „์‹ ์ˆœ์„œ๋กœ ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ๋ฌธ์ž 3๊ฐœ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ `t`๊ฐ€ ๊ฐ€์žฅ ์•ž์— ๋‚˜์˜ค๋ฉด  `tw`๋‹ค์Œ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 

result = []
for i in range(c - l + 1):
    a = [words[i]]
    bt(a) # [a] , [c],  [i]

 

์ด๋ฒˆ์—” ๋ฐฑํŠธ๋ž˜ํ‚น์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋ฌธ์ž์—ด์ด 4๊ฐœ์ธ ์•”ํ˜ธ๊ฐ€ ๋‹ค ์ฑ„์›Œ์กŒ์„ ๊ฒฝ์šฐ์—” ํ•ด๋‹น ๋ฌธ์ž์—ด(`result`)์„ ์ถœ๋ ฅํ•˜๊ณ  ๊ทธ ์ „๊นŒ์ง€๋Š” ๋ฌธ์ž๋ฅผ ์„œ๋กœ ๋น„๊ตํ•˜๋ฉด์„œ ์ฑ„์šธ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

def bt(result):
    if len(result) == l:
        if check(result):
            print("".join(result))
            return
        
    for i in range(len(result), c):
        if result[-1] < words[i]:
            result.append(words[i])
            bt(result)
            result.pop()

 

๋ฐฑํŠธ๋ž˜ํ‚น

๊ทธ ๋‹ค์Œ, `check` ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฌธ์ž์—ด์— ๋ชจ์Œ์ด 1๊ฐœ์ด์ƒ์ธ์ง€ ์ž์Œ์ด 2๊ฐœ์ด์ƒ์ธ์ง€๋ฅผ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์•”ํ˜ธ์— `a`๋‚˜ `i`๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ์ง€ ์•Š์œผ๋ฉด ๋‹ค์‹œ ๋Œ์•„๊ฐ€ ๋‹ค์Œ ๋ฌธ์ž๋กœ ํ™•์ธํ•˜๊ฒŒ ๋˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

def check(result):
    v, c = 0, 0
    for i in result:
        if i in vowels:
            v += 1
        else:
            c += 1
    
    if v >= 1 and c >= 2:
        return True
    else:
        return False

 


โ˜•๏ธ ๋งˆ์น˜๋ฉฐ

์˜ค๋Š˜๋„ ์ €์˜ ํฌ์ŠคํŠธ๋ฅผ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. 

์„ค๋ช…์ด ๋ถ€์กฑํ•˜๊ฑฐ๋‚˜ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ๋ถ€๋‹ด์—†์ด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.