๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Problem_Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 20055 ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ ์œ„์˜ ๋กœ๋ด‡ (Python/ํŒŒ์ด์ฌ)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2022. 9. 30.

<๋ฌธ์ œ ๋งํฌ>

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

 

20055๋ฒˆ: ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ ์œ„์˜ ๋กœ๋ด‡

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

www.acmicpc.net

<ํ’€์ด ์ „๋žต>

1. ์ฃผ์–ด์ง„ ์กฐ๊ฑด๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๋Š” ๊ตฌํ˜„ ๋ฌธ์ œ์ด๋‹ค.

2. ํฌ๊ฒŒ ๋ณต์žกํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‚˜ ๊ตฌํ˜„์€ ํ•„์š” ์—†๊ณ  ๋ฌธ์ œ ์ฝ๊ณ  ๋‹จ๊ณ„๋ณ„๋กœ ๊ฐ ๋™์ž‘์„ ๊ผผ๊ผผํžˆ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฌด๋‚œํ•˜๊ฒŒ ํ†ต๊ณผ ๋œ๋‹ค.

3. ๋ฒจํŠธ ํšŒ์ „์€ deque์˜ rotate() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ํŽธํ•˜๊ณ  ๋กœ๋ด‡์˜ ๋ฐฐ์—ด ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๋ฐํฌ๋ณด๋‹ค ๊ทธ๋ƒฅ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํŽธํ•˜๊ณ  ๋น ๋ฅด๋‹ค.

 

<์ •๋‹ต ์ฝ”๋“œ>

from collections import deque
import sys, os, io, atexit

input = lambda: sys.stdin.readline().rstrip('\r\n')
stdout = io.BytesIO()
sys.stdout.write = lambda s: stdout.write(s.encode("ascii"))
atexit.register(lambda: os.write(1, stdout.getvalue()))

# 220927 20055 ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ ์œ„์˜ ๋กœ๋ด‡

# ์ •๋‹ต์ฝ”๋“œ
 

# rotate: ๋ฒจํŠธ ํšŒ์ „
def rotate_belt():
    # ๋ฒจํŠธ ํšŒ์ „
    belt.rotate()
    # ๋ฒจํŠธ ์œ„์˜ ๋กœ๋ด‡ ํšŒ์ „ (๋‚ด๋ฆฌ๋Š” ์œ„์น˜์— ๋„๋‹ฌํ•˜๋ฉด ์ฆ‰์‹œ ๋‚ด๋ฆฐ๋‹ค)
    robot.pop()
    robot.insert(0, 0)
    return


# move_robot: ๋กœ๋ด‡ ์ด๋™
def move_robot():
    # ๋‚ด๋ฆฌ๋Š” ์œ„์น˜์— ๋„๋‹ฌํ•œ ๋กœ๋ด‡
    robot[-1] = 0
    # ์—ญ์ˆœ์œผ๋กœ ์ด๋™ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธํ•˜๋ฉด์„œ ์ „ ์นธ์˜ ๋กœ๋ด‡์„ ๋‹ค์Œ ์นธ์œผ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.
    for i in range(N - 2, -1, -1):
        # ๋กœ๋ด‡์ด ์žˆ์„ ๊ฒฝ์šฐ
        if robot[i]:
            # ๋‹ค์Œ ์นธ์— ๋กœ๋ด‡์ด ์—†๊ณ  ๋ฒจํŠธ ๋‚ด๊ตฌ๋„๊ฐ€ ๋‚จ์•„์žˆ์„ ๊ฒฝ์šฐ 
            if not robot[i + 1] and belt[i + 1]:
                # ๋กœ๋ด‡ ์ด๋™ 
                robot[i + 1] = 1
                robot[i] = 0
                # ๋ฒจํŠธ ๋‚ด๊ตฌ๋„ ๊ฐ์†Œ
                belt[i + 1] -= 1


# add_robot: ์˜ฌ๋ฆฌ๋Š” ์œ„์น˜์— ๋กœ๋ด‡ ์ถ”๊ฐ€
def add_robot():
    # ๋‚ด๊ตฌ๋„๊ฐ€ ๋‚จ์•„์žˆ์„ ๊ฒฝ์šฐ
    if belt[0]:
        # ๋กœ๋ด‡ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‚ด๊ตฌ๋„ ๊ฐ์†Œ
        robot[0] = 1
        belt[0] -= 1


# check: ์ข…๋ฃŒ ์กฐ๊ฑด ๋งŒ์กฑํ–ˆ๋Š”์ง€ ํ™•์ธ
def check():
    global idx
    cnt = 0
    
    # ์ข…๋ฃŒ ์กฐ๊ฑด ๋งŒ์กฑํ–ˆ์„ ๊ฒฝ์šฐ True ๋ฐ˜ํ™˜
    for durability in belt:
        if durability == 0:
            cnt += 1
            if cnt == K:
                return True

    # ์•„๋‹ ๊ฒฝ์šฐ ๋‹จ๊ณ„ ์ธ๋ฑ์Šค ์„ธ์ฃผ๊ธฐ
    idx += 1
    return False

# N: ๋ฒจํŠธ ํ•œ ์ชฝ ๋ฉด์˜ ๊ธธ์ด, K: ์ •๋ฃŒ ์กฐ๊ฑด 
N, K = map(int, input().split())
# belt: ๋ฒจํŠธ ์ƒํƒœ ํ robot: ๋กœ๋ด‡ ์ƒํƒœ ๋ฐฐ์—ด
belt = deque(map(int, input().split()))
robot = [0 for _ in range(N)]

# idx: ๋‹จ๊ณ„ ๋ฒˆํ˜ธ
idx = 1
# ์ข…๋ฃŒ ์กฐ๊ฑด ๋•Œ๊นŒ์ง€ ์ˆ˜ํ–‰
while True:
    rotate_belt()

    move_robot()
    
    add_robot()

    # ์ข…๋ฃŒ ์กฐ๊ฑด ๋งŒ์กฑ ์‹œ ๋‹จ๊ณ„ ๋ฒˆํ˜ธ ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ
    if check():
        print(idx)
        break

๋Œ“๊ธ€