[BOJ][๐ŸŸก5][๋ฐฑ์ค€#20055] ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ ์œ„์˜ ๋กœ๋ด‡

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #20055


๋ฌธ์ œ

๊ธธ์ด๊ฐ€ N์ธ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ๊ฐ€ ์žˆ๊ณ , ๊ธธ์ด๊ฐ€ 2N์ธ ๋ฒจํŠธ๊ฐ€ ์ด ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ๋ฅผ ์œ„์•„๋ž˜๋กœ ๊ฐ์‹ธ๋ฉฐ ๋Œ๊ณ  ์žˆ๋‹ค. ๋ฒจํŠธ๋Š” ๊ธธ์ด 1 ๊ฐ„๊ฒฉ์œผ๋กœ 2N๊ฐœ์˜ ์นธ์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ์œผ๋ฉฐ, ๊ฐ ์นธ์—๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด 1๋ถ€ํ„ฐ 2N๊นŒ์ง€์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋‹ค.

๋ฒจํŠธ๊ฐ€ ํ•œ ์นธ ํšŒ์ „ํ•˜๋ฉด 1๋ฒˆ๋ถ€ํ„ฐ 2N-1๋ฒˆ๊นŒ์ง€์˜ ์นธ์€ ๋‹ค์Œ ๋ฒˆํ˜ธ์˜ ์นธ์ด ์žˆ๋Š” ์œ„์น˜๋กœ ์ด๋™ํ•˜๊ณ , 2N๋ฒˆ ์นธ์€ 1๋ฒˆ ์นธ์˜ ์œ„์น˜๋กœ ์ด๋™ํ•œ๋‹ค. i๋ฒˆ ์นธ์˜ ๋‚ด๊ตฌ๋„๋Š” Ai์ด๋‹ค. ์œ„์˜ ๊ทธ๋ฆผ์—์„œ 1๋ฒˆ ์นธ์ด ์žˆ๋Š” ์œ„์น˜๋ฅผ โ€œ์˜ฌ๋ฆฌ๋Š” ์œ„์น˜โ€, N๋ฒˆ ์นธ์ด ์žˆ๋Š” ์œ„์น˜๋ฅผ โ€œ๋‚ด๋ฆฌ๋Š” ์œ„์น˜โ€๋ผ๊ณ  ํ•œ๋‹ค. ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ์— ๋ฐ•์Šค ๋ชจ์–‘ ๋กœ๋ด‡์„ ํ•˜๋‚˜์”ฉ ์˜ฌ๋ฆฌ๋ ค๊ณ  ํ•œ๋‹ค. ๋กœ๋ด‡์€ ์˜ฌ๋ฆฌ๋Š” ์œ„์น˜์—๋งŒ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ์–ธ์ œ๋“ ์ง€ ๋กœ๋ด‡์ด ๋‚ด๋ฆฌ๋Š” ์œ„์น˜์— ๋„๋‹ฌํ•˜๋ฉด ๊ทธ ์ฆ‰์‹œ ๋‚ด๋ฆฐ๋‹ค. ๋กœ๋ด‡์€ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ ์œ„์—์„œ ์Šค์Šค๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋กœ๋ด‡์„ ์˜ฌ๋ฆฌ๋Š” ์œ„์น˜์— ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜ ๋กœ๋ด‡์ด ์–ด๋–ค ์นธ์œผ๋กœ ์ด๋™ํ•˜๋ฉด ๊ทธ ์นธ์˜ ๋‚ด๊ตฌ๋„๋Š” ์ฆ‰์‹œ 1๋งŒํผ ๊ฐ์†Œํ•œ๋‹ค. ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ๋ฅผ ์ด์šฉํ•ด ๋กœ๋ด‡๋“ค์„ ๊ฑด๋„ˆํŽธ์œผ๋กœ ์˜ฎ๊ธฐ๋ ค๊ณ  ํ•œ๋‹ค. ๋กœ๋ด‡์„ ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ผ์ด ์ˆœ์„œ๋Œ€๋กœ ์ผ์–ด๋‚œ๋‹ค.

๋ฒจํŠธ๊ฐ€ ๊ฐ ์นธ ์œ„์— ์žˆ๋Š” ๋กœ๋ด‡๊ณผ ํ•จ๊ป˜ ํ•œ ์นธย ํšŒ์ „ํ•œ๋‹ค. ๊ฐ€์žฅ ๋จผ์ € ๋ฒจํŠธ์— ์˜ฌ๋ผ๊ฐ„ ๋กœ๋ด‡๋ถ€ํ„ฐ, ๋ฒจํŠธ๊ฐ€ ํšŒ์ „ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ•œ ์นธ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด๋™ํ•œ๋‹ค. ๋งŒ์•ฝ ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๊ฐ€๋งŒํžˆ ์žˆ๋Š”๋‹ค.

๋กœ๋ด‡์ด ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด๋™ํ•˜๋ ค๋Š” ์นธ์— ๋กœ๋ด‡์ด ์—†์œผ๋ฉฐ, ๊ทธ ์นธ์˜ ๋‚ด๊ตฌ๋„๊ฐ€ 1 ์ด์ƒ ๋‚จ์•„ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์˜ฌ๋ฆฌ๋Š” ์œ„์น˜์— ์žˆ๋Š” ์นธ์˜ ๋‚ด๊ตฌ๋„๊ฐ€ 0์ด ์•„๋‹ˆ๋ฉด ์˜ฌ๋ฆฌ๋Š” ์œ„์น˜์— ๋กœ๋ด‡์„ ์˜ฌ๋ฆฐ๋‹ค. ๋‚ด๊ตฌ๋„๊ฐ€ 0์ธ ์นธ์˜ ๊ฐœ์ˆ˜๊ฐ€ K๊ฐœ ์ด์ƒ์ด๋ผ๋ฉด ๊ณผ์ •์„ ์ข…๋ฃŒํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด 1๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.

์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ ๋ช‡ ๋ฒˆ์งธ ๋‹จ๊ณ„๊ฐ€ ์ง„ํ–‰ ์ค‘์ด์—ˆ๋Š”์ง€ ๊ตฌํ•ด๋ณด์ž. ๊ฐ€์žฅ ์ฒ˜์Œ ์ˆ˜ํ–‰๋˜๋Š” ๋‹จ๊ณ„๋Š” 1๋ฒˆ์งธ ๋‹จ๊ณ„์ด๋‹ค.


์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N, K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” A1, A2, โ€ฆ, A2N์ด ์ฃผ์–ด์ง„๋‹ค.


์ถœ๋ ฅ

๋ช‡ ๋ฒˆ์งธ ๋‹จ๊ณ„๊ฐ€ ์ง„ํ–‰ ์ค‘์ผ๋•Œ ์ข…๋ฃŒ๋˜์—ˆ๋Š”์ง€ ์ถœ๋ ฅํ•œ๋‹ค.


์ œํ•œ

2 โ‰ค N โ‰ค 100 1 โ‰ค K โ‰ค 2N 1 โ‰ค Ai โ‰ค 1,000


์˜ˆ์ œ

์˜ˆ์ œ 1

์ž…๋ ฅ

3 2
1 2 1 2 1 2


์ถœ๋ ฅ

2


์˜ˆ์ œ 2

์ž…๋ ฅ

3 6
10 10 10 10 10 10


์ถœ๋ ฅ

31


์˜ˆ์ œ 3

์ž…๋ ฅ

4 5
10 1 10 6 3 4 8 2


์ถœ๋ ฅ

24


์˜ˆ์ œ 4

์ž…๋ ฅ

5 8
100 99 60 80 30 20 10 89 99 100


์ถœ๋ ฅ

472


My Sol

from collections import deque

def Rotate():
    global status, CV
    CV.appendleft(CV.pop())
    k = N-1
    while k > 0:
        status[k] = status[k-1]
        k -= 1
    status[0] = status[N-1] = 0

def Move(i):
    global status, CV
    k = i
    while k > 0:
        if status[k-1] and not status[k] and CV[k]:
            status[k], status[k-1] = 1, 0
            checkHurt(k)
            CV[k] -= 1
        k -= 1

def Insert():
    global status, CV
    if not CV[0]: return
    status[0] = 1
    checkHurt(0)
    CV[0] -= 1


def checkHurt(i):
    if CV[i]==1:
        global hurt
        hurt += 1

N, K = map(int, input().split())
CV = deque(list(map(int, input().split())))
status = deque([0]*N)

cnt = 0
hurt = 0
while hurt < K:
    Rotate()
    Move(N-1)
    status[N-1] = 0
    Insert()
    cnt += 1

print(cnt)

์ •๋ง ๊ตฌํ˜„๋ฌธ์ œ์˜€๋‹ค. ๋ฌธ์ œ์—์„œ ์ œ์‹œ๋œ๋Œ€๋กœ ์ˆœ์„œ๋Œ€๋กœ ํšŒ์ „, ์ด๋™, ๋‚ด๋ ค๋†“๊ธฐ ์˜ ๊ณผ์ •์„ ์‹ค์‹œํ•˜๋Š” ๊ฐ๊ฐ์˜ ํ•จ์ˆ˜ Rotate(), Move(), Insert() ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋ชจ๋“ˆํ™”ํ•˜์˜€๊ณ , ๋กœ๋ด‡์„ ๋‚ด๋ ค๋†“๊ฑฐ๋‚˜ ์ด๋™ํ•˜๊ธฐ ์ „์— ํ•ด๋‹น ์ขŒํ‘œ์˜ ๋‚ด๊ตฌ๋„๊ฐ€ 1์ด๋ผ๋ฉด ์ „์—ญ๋ณ€์ˆ˜ hurt๋ฅผ 1 ๋Š˜๋ฆฌ๊ณ  ์ด๋™์‹œ์ผฐ๋‹ค. ๋งค๋ฒˆ 0์„ ์…€ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!


๋ชจ๋ฒ”๋‹ต์•ˆ

์ถœ์ฒ˜

from collections import deque
import sys
read = sys.stdin.readline


# ๋ฒจํŠธ๊ฐ€ ํ•œ ์นธ ํšŒ์ „ํ•œ๋‹ค.
def rotate():
    A.appendleft(A.pop())
    robots.appendleft(robots.pop())
    # ํšŒ์ „ ํ›„ ๋‚ด๋ฆฌ๋Š” ์œ„์น˜์— ๋กœ๋ด‡์ด ์žˆ๋‹ค๋ฉด ๋กœ๋ด‡์„ ์—†์• ์ค€๋‹ค
    robots[N - 1] = False


# ๋กœ๋ด‡์ด ๋ฒจํŠธ ํšŒ์ „ ๋ฐฉํ–ฅ์œผ๋กœ ํ•œ ์นธ ์ด๋™ํ•œ๋‹ค.
def move():
    for index in range(N - 2, 0 - 1, -1):  # up <- down ์ˆœ์œผ๋กœ ๊ฐ ์นธ๋ณ„๋กœ ํ™•์ธ
        if robots[index] and not robots[index + 1] and A[index + 1] >= 1:  # ์›€์ง์ผ ์ˆ˜ ์žˆ์œผ๋ฉด
            robots[index] = False  # ํ˜„์žฌ ์œ„์น˜์—์„œ
            add_robot(index + 1)  # ๋‹ค์Œ ์œ„์น˜๋กœ ์ด๋™

            if index + 1 == N - 1:  # ๋กœ๋ด‡์ด ๋‚ด๋ฆฌ๋Š” ์œ„์น˜๋กœ ์›€์ง์˜€์œผ๋ฉด
                robots[index + 1] = False


# index ์œ„์น˜์— ๋กœ๋ด‡์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
def add_robot(index):
    if A[index] >= 1:
        robots[index] = True
        A[index] -= 1  # ๋‚ด๊ตฌ๋„ ๊ฐ์†Œ

        if A[index] == 0:
            zero_count[0] += 1


# N: ๋ฒจํŠธ์˜ ๊ธธ์ด 2, K: ์ข…๋ฃŒ ์กฐ๊ฑด (๋‚ด๊ตฌ๋„๊ฐ€ K๊ฐœ ์ด์ƒ์ด๋ฉด ์ข…๋ฃŒ)
N, K = map(int, read().split())
# A: ๊ฐ ์นธ์˜ ๋‚ด๊ตฌ๋„
A = deque(map(int, read().split(" ")))
# ๋กœ๋ด‡์ด ์œ„์น˜ํ•ด์žˆ๋Š”์ง€ ์—ฌ๋ถ€
robots = deque([False] * N)
# ๋‚ด๊ตฌ๋„๊ฐ€ 0์ธ ์นธ์˜ ๊ฐœ์ˆ˜
zero_count = [0]

step = 0
while zero_count[0] < K:
    rotate()
    move()
    add_robot(0)

    step += 1

print(step)

์—ฐ์‚ฐ์‹œ๊ฐ„์ด ๊ฑฐ์˜ ์ ˆ๋ฐ˜์ธ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™”๋‹ค.

๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ ์ผ์น˜ํ•˜๋Š”๋ฐ rotate์—์„œ ๋กœ๋ด‡์˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚ด์— ์žˆ์–ด ๋‚˜๋Š” ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ชจ๋‘ ๋Œ๋ ค์ฃผ์–ด ๊ฐ’์„ ๋ฐ€์–ด์„œ ๋ฐ”๊ฟ”์ฃผ์—ˆ๋Š”๋ฐ, status๋„ deque์ธ๋งŒํผ CV์™€ ๋˜‘๊ฐ™์ด pop, appendleft ํ•ด์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ๋‚˜๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊ฟ”๋ณด๋‹ˆ ์—ฐ์‚ฐ์‹œ๊ฐ„์ด 4500ms์—์„œ 2500ms๋กœ ๊ฐ์†Œํ•˜์˜€๋‹ค.

์กฐ๊ธˆ์˜ ๋ณ€ํ™”๊ฐ€ ์ด๋ ‡๊ฒŒ ํฐ ์ฐจ์ด๋ฅผ ๋งŒ๋“œ๋‹ˆ ๋ฌด์Šจ ์ฝ”๋“œ๋ฅผ ์งœ๋“  ์ž˜ ๊ณ ๋ คํ•ด๋ณผ ์ผ์ด๋‹ค.

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ