๐Ÿšถโ€โ™‚๏ธRoad to ์ฝ”ํ…Œ(11) - ๋ฐฑํŠธ๋ž˜ํ‚น

์•ˆํƒœํ˜„ยท2025๋…„ 1์›” 3์ผ

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
11/15

๋ณธ ๊ฒŒ์‹œ๋ฌผ์€ BaaarkingDog๋‹˜์˜ ์‹ค์ „ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ•์˜๋ฅผ ํ†ตํ•ด ๊ณต๋ถ€ํ•œ ๊ฒƒ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

[์ถ”๊ฐ€] ์šฉ๊ฐํ•˜๊ฒŒ ์‹œ์ž‘ํ•˜๋Š” ์ฝ”๋”ฉํ…Œ์ŠคํŠธ

[์ถ”๊ฐ€] ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ํ•ฉ๊ฒฉ์ž ๋˜๊ธฐ - ํŒŒ์ด์ฌ

[์ถ”๊ฐ€] ์ขŒ์ถฉ์šฐ๋Œ, ํŒŒ์ด์ฌ์œผ๋กœ ์ž๋ฃŒ๊ตฌ์กฐ ๊ตฌํ˜„ํ•˜๊ธฐ

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

ํ˜„์žฌ ์ƒํƒœ์—์„œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํ›„๋ณด๊ตฐ์„ ๋”ฐ๋ผ ๋“ค์–ด๊ฐ€๋ฉฐ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
์ฆ‰, ํ˜„์žฌ ์ƒํƒœ์—์„œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์„ ํƒ์ง€๋ฅผ ๋‹ค ํ”Œ๋ ˆ์ดํ•ด๋ณด๋Š” ๋ฐฉ๋ฒ•์ด ๋ฐฑํŠธ๋ž˜ํ‚น์ด๋‹ค.
-> ์ƒํƒœ๊ณต๊ฐ„ํŠธ๋ฆฌ๋ผ๊ณ ๋„ ํ•œ๋‹ค.

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

DFS์™€ ํ˜ผ๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐฑํŠธ๋ž˜ํ‚น์€ ๋ถˆํ•„์š”ํ•œ ํƒ์ƒ‰์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, 132,234,123 ์ค‘ 123์„ ์ฐพ์„๋•Œ 132์— ์ ‘๊ทผํ–ˆ์„๋•Œ 10์˜ ์ž๋ฆฌ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ์ˆ˜๋กœ ๋ฐ”๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

์žฌ๊ท€์˜ ์„ฑ๊ฒฉ์„ ๋„๊ณ  ์žˆ๋‹ค.

๋ฐฑํŠธ๋ž˜ํ‚น ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ๋‹ค.

def backtrack(candidate):
	# ๋งŒ์•ฝ ํ˜„์žฌ ํ›„๋ณด๊ตฐ์ด ์œ ํšจํ•œ ํ•ด๋ผ๋ฉด ์ •๋‹ต ์ฒ˜๋ฆฌํ•˜๊ณ  backtrack ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒ
    if find_solution(candidate):
        output(candidate)
        return
    
    # ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํ›„๋ณด๊ตฐ์— ๋Œ€ํ•ด ํƒ์ƒ‰
    for next_candidate in list_of_candidates:
    	# ์œ ํšจํ•œ ํ›„๋ณด๊ตฐ์ธ ๊ฒฝ์šฐ์—๋งŒ ํƒ์ƒ‰ ์ง„ํ–‰
        if is_valid(next_candidate):
            # ์ด ํ›„๋ณด๊ตฐ์„ ์šฐ์„  ์ถ”๊ฐ€ํ•˜๊ณ ,
            place(next_candidate)
            # ํ›„๋ณด๊ตฐ์„ ์ถ”๊ฐ€ํ•œ ์ƒํƒœ์—์„œ ๋‹ค์Œ ํ›„๋ณด๊ตฐ์— ๋Œ€ํ•ด์„œ ํƒ์ƒ‰ ์ง„ํ–‰
            backtrack(next_candidate)
            # ํ•ด๋‹น ํ›„๋ณด๊ตฐ์— ๋Œ€ํ•œ ํƒ์ƒ‰์„ ์ข…๋ฃŒํ•œ ์ดํ›„์—๋Š” ์ œ๊ฑฐ
            remove(next_candidate)

์—ฐ์Šต๋ฌธ์ œ1 - 15649 N๊ณผ M(1)

import sys

n,m=map(int,sys.stdin.readline().split())
ans=[]

def back():
  if len(ans)==m: #base condition
    print(" ".join(map(str,ans))) #m๊ฐœ๋ฅผ ๋ชจ๋‘ ์„ ํƒํ–ˆ์œผ๋ฉด ์ถœ๋ ฅํ•˜๊ณ 
    return #ํ˜„์žฌ ์žฌ๊ท€ ํ•จ์ˆ˜ ์ข…๋ฃŒํ•œ๋‹ค. 
  for i in range(1,n+1): #์žฌ๊ท€ ํ•จ์ˆ˜
    if i not in ans: #i๊ฐ€ ์ •๋‹ต ๋ฆฌ์ŠคํŠธ์—์—†์œผ๋ฉด
      ans.append(i) # ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€
      back() 
      ans.pop() #return์„ ํ•˜๋ฉด ๋‹ค์‹œ ์—ฌ๊ธฐ๋กœ ๋Œ์•„์˜ด. 

back()

์—ฐ์Šต๋ฌธ์ œ2 - 9663 N-Queen

import sys
input=sys.stdin.readline
n=int(input())
sys.setrecursionlimit(10 ** 4)

"""
queen์€ ์ƒํ•˜์ขŒ์šฐ๋Œ€๊ฐ์„  ๋ชจ๋‘ ๊ณต๊ฒฉ๊ฐ€๋Šฅ
๊ฐ™์€ ์—ด ๋ถˆ๊ฐ€, ๊ฐ™์€ ํ–‰ ๋ถˆ๊ฐ€
๋Œ€๊ฐ์„  ๋ถˆ๊ฐ€
[ํ–‰ index+1,์—ด index+1],[ํ–‰ index-1,์—ด index-1] ๋ถˆ๊ฐ€
[ํ–‰ index-1,์—ด index+1],[ํ–‰ index+1,์—ด index-1] ๋ถˆ๊ฐ€
ํ˜„์žฌ ํ–‰์ด ๋ณด๋“œํŒ ์‚ฌ์ด์ฆˆ(n)๋ณด๋‹ค ํฌ๋ฉด ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ• ํ•œ ๊ฐ€์ง€ ์ฐพ์•˜๋‹ค ์ƒ๊ฐํ•ด 1์„ ๋ฆฌํ„ด.
ํ˜„์žฌ ์นธ์˜ ์—ด, ๋Œ€๊ฐ์„ , reverse๋Œ€๊ฐ์„ (์˜ค๋ฅธ์ชฝ ์œ„๋กœ)์— ํ€ธ์ด ๋†“์•„์ ธ ์žˆ์œผ๋ฉด ๋‹ค์Œ ์—ด๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
ํ˜„์žฌ ์นธ์— ํ€ธ์„ ๋†“์„ ์ˆ˜ ์žˆ์œผ๋ฉด row,col์„ ๊ณ„์‚ฐํ•ด์„œ ์—ด,๋Œ€๊ฐ์„ ,reverse๋Œ€๊ฐ์„ ์— ๋„ฃ๋Š”๋‹ค


"""
cnt=0

def chess(row,cross,cross_reverse,cols):
  global n
  if row==n:
    
    return 1
  
  sol = 0
  for col in range(n):
    curr_cross= row-col #ํ˜„์žฌ ๊ธฐ์ค€ Right to left ์•„๋ž˜ ๋Œ€๊ฐ์„ ์€ ํ–‰-์—ด
    curr_cross_reverse=row+col #ํ˜„์žฌ ๊ธฐ์ค€  Left to right ๋Œ€๊ฐ์„ ์€ ์—ด๊ณผ ํ–‰ ๋”ํ•˜๊ธฐ
    
    
    if (col in cols or curr_cross in cross or curr_cross_reverse in cross_reverse):
      continue
    
    cols.add(col)
    cross.add(curr_cross)
    cross_reverse.add(curr_cross_reverse)
    sol+=chess(row+1,cross,cross_reverse,cols)
    
    #๋งŒ์•ฝ์— return์ด ๋‚˜์˜ค๋ฉด ๋˜๋Œ์•„๊ฐ€๋ฉด์„œ set์—์„œ ์ถ”๊ฐ€ํ–ˆ๋˜ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค..
    cols.remove(col)
    cross.remove(curr_cross)
    cross_reverse.remove(curr_cross_reverse)
  
  return sol

print(chess(0,set(),set(),set()))

์™œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜์˜ฌ๊นŒ pypy3๋ฅผ ์‚ฌ์šฉํ•˜๋‹ˆ ํ•ด๊ฒฐ
๐ŸšฉPyPy3 : JIT(Just In Time) ์ปดํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋А๋ฆฐ ์‹คํ–‰์†๋„๋ฅผ ๊ฐœ์„ ํ•œ๋‹ค.
Python3๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ, ์†๋„ ์ธก์—์„œ ์šฐ์„ธํ•˜๊ณ , ๋ฐ˜๋ณต์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ PyPy3๊ฐ€ ์šฐ์„ธํ•˜๋‹ค.

์—ฐ์Šต๋ฌธ์ œ3 - 15650 N๊ณผ M(2)

import sys

n,m=map(int,sys.stdin.readline().split())
ans=[]

def back():
  if len(ans)==m: #base condition
    print(" ".join(map(str,ans))) #m๊ฐœ๋ฅผ ๋ชจ๋‘ ์„ ํƒํ–ˆ์œผ๋ฉด ์ถœ๋ ฅํ•˜๊ณ 
    return #ํ˜„์žฌ ์žฌ๊ท€ ํ•จ์ˆ˜ ์ข…๋ฃŒํ•œ๋‹ค. 
  for i in range(1,n+1): #์žฌ๊ท€ ํ•จ์ˆ˜
    if i not in ans: #i๊ฐ€ ์ •๋‹ต ๋ฆฌ์ŠคํŠธ์—์—†์œผ๋ฉด
      ans.append(i) # ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€
      back() 
      ans.pop() #return์„ ํ•˜๋ฉด ๋‹ค์‹œ ์—ฌ๊ธฐ๋กœ ๋Œ์•„์˜ด. 

back()
profile
๊ณ ๊ฐ์—๊ฒŒ ์‹ ๋ขฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ์•ˆํƒœํ˜„์ž…๋‹ˆ๋‹ค.

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