➰ 취업준비/알고리즘 문제풀이

[삼성/코테기출][Python][백준][20055] 컨베이어 벨트 위의 로봇 (시뮬레이션/구현)

 사과개발자 2021. 4. 15. 23:03

🍋 문제링크

🍎 코드 제출 기록 (메모리 및 시간)

메모리 : 123444 KB

시간 : 1284 ms

🍓 문제풀이

if __name__ == '__main__':
    N, K = map(int, input().split())
    belt = list(map(int, input().split()))
    robot = []

    cnt = 0  # 횟수를 저장할 변수
    up_idx = 0  # 올라가는 위치의 인덱스
    down_idx = N - 1  # 내려가는 위치의 인덱스

    while belt.count(0) < K:  # 내구도가 0인 벨트가 K개 이상이면 끝
        cnt += 1
        # 한칸씩 오른쪽으로 회전
        up_idx = (2 * N - 1) if (up_idx == 0) else (up_idx - 1)
        down_idx = (2 * N - 1) if (down_idx == 0) else (down_idx - 1)

        # 내려가는 칸에 있는 로봇내리기
        if down_idx in robot:
            robot.remove(down_idx)

        # 로봇 오른쪽으로 한칸씩 이동(가능하면)
        temp = robot
        for pos in temp:
            robot.remove(pos)
            next = 0 if (pos == (2 * N - 1)) else (pos + 1)
            if (next not in robot) and (belt[next] > 0):
                belt[next] -= 1
                if next != down_idx:
                    robot.append(next)
            else:
                robot.append(pos)

        # 올라가는 위치에 로봇이 없다면 하나 올려주기
        if (up_idx not in robot) and (belt[up_idx] > 0):
            robot.append(up_idx)
            belt[up_idx] -= 1

    print(cnt)

if __name__ == '__main__':
    N, K = map(int, input().split())
    belt = list(map(int, input().split()))
    robot = [0 for _ in range(2*N)]

    cnt = 0  # 횟수를 저장할 변수
    up_idx = 0  # 올라가는 위치의 인덱스
    down_idx = N - 1  # 내려가는 위치의 인덱스

    while belt.count(0) < K:  # 내구도가 0인 벨트가 K개 이상이면 끝
        cnt += 1
        # 한칸씩 오른쪽으로 회전
        up_idx = (2 * N - 1) if (up_idx == 0) else (up_idx - 1)
        down_idx = (2 * N - 1) if (down_idx == 0) else (down_idx - 1)

        # 내려가는 위치에 있는 로봇내리기
        robot[down_idx] = 0

        # 로봇 오른쪽으로 한칸씩 이동(가능하면)
        for i in range(N):
            pos = down_idx-i if (down_idx-i >= 0) else (2*N + down_idx - i)
            next = 0 if (pos == (2 * N - 1)) else (pos + 1)
            if (robot[pos] == 1) and (robot[next] == 0) and (belt[next] > 0):
                belt[next] -= 1
                robot[pos] = 0
                robot[next] = 1

        # 내려가는 위치에 있는 로봇내리기
        robot[down_idx] = 0

        # 올라가는 위치에 로봇이 없다면 하나 올려주기
        if (robot[up_idx] == 0) and (belt[up_idx] > 0):
            robot[up_idx] = 1
            belt[up_idx] -= 1

    print(cnt)
반응형