๐Ÿงฉ Problem Solving/[๋ฐฑ์ค€]

[๋ฐฑ์ค€] 28286 ์žฌ์ฑ„์ ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘ (python ํŒŒ์ด์ฌ)

์ œ๋ด‰์•„ 2023. 7. 5. 00:31

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

 

28286๋ฒˆ: ์žฌ์ฑ„์ ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘

UCPC๊ณ ๋“ฑํ•™๊ต์— ๋‹ค๋‹ˆ๋Š” ๋ฏผ๊ทœ๋Š” ์ตœ๊ทผ์— ๊ธฐ๋ง๊ณ ์‚ฌ๋ฅผ ์น˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ธฐ๋ง๊ณ ์‚ฌ๋Š” $N$๋ฌธ์ œ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ๊ฐ ๋ฌธ์ œ๋Š” ๋ณด๊ธฐ๊ฐ€ 1 ์ด์ƒ 5 ์ดํ•˜์˜ ์ •์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฐ๊ด€์‹ ๋ฌธ์ œ์ด๋‹ค. ์‹œ๊ฐ„์ด ์ง€๋‚˜ ํ•™๊ต์—์„œ

www.acmicpc.net


์ฒ˜์Œ ๋ฌธ์ œ๋ฅผ ์ฝ์—ˆ์„ ๋•Œ๋Š” ์‹œ๊ฐ„์„ ์–ด๋–ป๊ฒŒ ์ค„์ผ๊นŒ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ, ์ž…๋ ฅ๊ฐ’์ด ๋งค์šฐ ์ž‘๋‹ค.(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๊ฐ’์„ ์ œํ•œ์œผ๋กœ ๋‘๊ณ  ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ตœ๋Œ€ ์ •๋‹ต ๊ฐœ์ˆ˜๋ฅผ ์ฐพ์•„์ค€๋‹ค.