https://www.acmicpc.net/problem/28286
์ฒ์ ๋ฌธ์ ๋ฅผ ์ฝ์์ ๋๋ ์๊ฐ์ ์ด๋ป๊ฒ ์ค์ผ๊น ๊ณ ๋ฏผํ๋๋ฐ, ์ ๋ ฅ๊ฐ์ด ๋งค์ฐ ์๋ค.(max(N) = 20, max(K) = 3)
๋ฌด๋ํ ๋ฌธ์ . ๋ฐฑํธ๋ํน์ ์ฌ์ฉํด์ ์ต๋ ๊ฐ์๋ฅผ ์ฐพ์์ค๋ค.
์์ด๋์ด
1. pull: ๋ฒํธ๋ค์ ์ผ์ชฝ์ผ๋ก ๋น๊ธฐ๋ ๊ธฐ๋ฅ. rotate๋ฅผ ์จ์ ๊ตฌํํ๋ค. for๋ฌธ์ผ๋ก ๊ตฌํํด๋ ๋๋ค.
2. push: ๋ฒํธ๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฏธ๋ ๊ธฐ๋ฅ. pull๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก rotate๋ฅผ ์จ์ ๊ตฌํํ๋ค.
3. backTracking: K๋ ์์ ์ ์ต๋ ํ์ ์ด๋ฏ๋ก K๋ฒ๋ณด๋ค ์ ๊ฒ ํ๋ ๊ฒฝ์ฐ๋ ๊ณ ๋ คํด์ค์ผ ํ๋ค. ์ฌ๋ฌ ๊ฐ์ง case ์ค ์ต๋๊ฐ์ด ๋์จ ๊ฑธ return ํด์ค๋ค.
์ ์ฒด ์ฝ๋
from collections import deque
n = 0
result = 0
N, K = map(int, input().split())
answer = list(map(int, input().split()))
OMR = list(map(int, input().split()))
def pull(arr, p):
a1, a2 = arr[:p], deque(arr[p:])
a2.rotate(-1)
a2[-1] = -1
return a1 + list(a2)
def push(arr, p):
a1, a2 = arr[:p], deque(arr[p:])
a2.rotate(1)
a2[0] = -1
return a1 + list(a2)
def dfs(n, Arr):
global result
count = 0
for i in range(N):
if answer[i] == Arr[i]:
count += 1
if count > result:
result = count
if n < K:
for i in range(N):
dfs(n + 1, pull(Arr, i))
dfs(n + 1, push(Arr, i))
dfs(0, OMR)
print(result)
์ฝ๋ ์ค๋ช
def pull(arr, p):
a1, a2 = arr[:p], deque(arr[p:])
a2.rotate(-1)
a2[-1] = -1
return a1 + list(a2)
pull๊ณผ push๋ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ ์ ์์ง๋ง, ๋ split๊ณผ rotate๋ฅผ ์จ์ ๊ตฌํํ๋ค. rotate ๋ฉ์๋๋ฅผ ์ฐ๊ธฐ ์ํด deque๋ฅผ import ํด์ฃผ์.
def backTracking(n, Arr):
global result
count = 0
for i in range(N):
if answer[i] == Arr[i]:
count += 1
if count > result:
result = count
if n < K:
for i in range(N):
backTracking(n + 1, pull(Arr, i))
backTracking(n + 1, push(Arr, i))
K๊ฐ์ ์ ํ์ผ๋ก ๋๊ณ ์ฌ๊ท ํจ์๋ฅผ ์ฌ์ฉํด ์ต๋ ์ ๋ต ๊ฐ์๋ฅผ ์ฐพ์์ค๋ค.