[백준] 20055번 - 컨테이너 벨트 위의 로봇

1차

코드

N,K = map(int,input().split())
belt = list(map(int,input().split()))
robots = [0] * N

belt[0] -= 1
robots[0] = 1

cnt = 0

def belt_move():
    tmp = belt[-1]
    for i in range(2 * N, 0, -1):
        if i == 1:
            belt[0] = tmp
        else:
            belt[i - 1] = belt[i - 2]

def robot_move():
    for i in range(N-1,-1,-1):
        if i == 0:
            robots[0] = 0
        else:
            robots[i] = robots[i-1]

def max_index():
    for i in range(N-1,-1,-1):
        print("i = ",i)
        if robots[i] == 1:
            break
    return i

while True:
    cnt += 1
    print("count = ",cnt)
    print("기본")
    print(belt)
    print(robots)

    print("1단계")

    if robots[-1] == 1:
        robots[-1] = 0

    belt_move()
    robot_move()

    if robots[-1] == 1:
        robots[-1] = 0

    print(belt)
    print(robots)

    print("2단계")
    maxI = max_index()
    print("robot 젤 먼저 있는 위치 = ", maxI)
    for j in range(maxI+1,-1,-1):
        print("j = ",j)
        if robots[j] == 1:
            if (robots[j + 1] == 0) and (belt[j + 1] >= 1):
                robots[j] = 0
                robots[j + 1] = 1
                belt[j + 1] -= 1  # 이동하는 칸 내구도 1 감소

    print(belt)
    print(robots)

    print("3단계")
    if belt[0] != 0:
        robots[0] = 1
        belt[0] -= 1

    print(belt)
    print(robots)

    print("4단계")
    print(list(filter(lambda x : x == 0, belt)))

    if len(list(filter(lambda x : x == 0, belt))) >= K:
        break

print("final = ",cnt)

초기에 컨테이너 위에 로봇은 하나도 없음
단계를 수행하면서 로봇이 올려지는 것

2차

코드

N,K = map(int,input().split())
belt = list(map(int,input().split()))
robots = [0] * N
cnt = 0

def belt_move():
    tmp = belt[-1]
    for i in range(2 * N, 0, -1):
        if i == 1:
            belt[0] = tmp
        else:
            belt[i - 1] = belt[i - 2]

def robot_move():
    for i in range(N-1,-1,-1):
        if i == 0:
            robots[0] = 0
        else:
            robots[i] = robots[i-1]

def max_index():
    for i in range(N-1,-1,-1):
        if robots[i] == 1:
            break
    return i

while True:
    cnt += 1

    #1단계
    if robots[-1] == 1:
        robots[-1] = 0
    belt_move()
    robot_move()
    if robots[-1] == 1:
        robots[-1] = 0

    #2단계
    maxI = max_index()
    for j in range(maxI+1,-1,-1):
        if robots[j] == 1:
            if (robots[j + 1] == 0) and (belt[j + 1] >= 1):
                robots[j] = 0
                robots[j + 1] = 1
                belt[j + 1] -= 1  # 이동하는 칸 내구도 1 감소

    #3단계
    if belt[0] != 0:
        robots[0] = 1
        belt[0] -= 1

    #4단계
    if len(list(filter(lambda x : x == 0, belt))) >= K:
        break

print(cnt)

시간초과
-> 스스로도 시간초과가 나겠구나 생각하긴 했음..ㅜㅜ

3차

아이디어

1) sys 사용 -> input시간 축소

기존
N = map(int,input().split()
수정
import sys
N = map(int,sys.stdin.readline().split())

2) 시간초과를 줄이기 위해 deque를 사용해보려고 한다..!
이때, deque에 rotate라는 함수가 있다는 것을 알게 되었다..매우 유용하게 쓰일것 같다..!!

deque.rotate(num) = num만큼 회전한다(양수면 오른쪽으로, 음수면 왼쪽으로)

3) count함수 사용으로 0값 체크

list.count(num) = list에 num이 몇 개인지 count해줌

코드

from collections import deque
import sys

N,K = map(int,sys.stdin.readline().split())
belt = deque(list(map(int,sys.stdin.readline().split())))
robots = deque([0] * N)
cnt = 0

def max_index():
    for i in range(N-1,-1,-1):
        if robots[i] == 1:
            break
    return i

while True:
    cnt += 1

    #1단계
    if robots[-1] == 1:
        robots[-1] = 0
    belt.rotate()
    robots.rotate()
    if robots[-1] == 1:
        robots[-1] = 0

    #2단계
    maxI = max_index()
    for j in range(maxI+1,-1,-1):
        if robots[j] == 1:
            if (robots[j + 1] == 0) and (belt[j + 1] >= 1):
                robots[j] = 0
                robots[j + 1] = 1
                belt[j + 1] -= 1  # 이동하는 칸 내구도 1 감소

    #3단계
    if belt[0] != 0:
        robots[0] = 1
        belt[0] -= 1

    #4단계
    if belt.count(0) >= K:
        break

print(cnt)

좋은 웹페이지 즐겨찾기