코딩 공부

[Python] 백준 20055번 : 컨베이어 벨트 위의 로봇 본문

삼성 SW 역량 테스트 기출 문제

[Python] 백준 20055번 : 컨베이어 벨트 위의 로봇

Algomalgo 2024. 1. 28. 15:58
728x90


<접근 방법>

  1. 과정이 순서대로 나와있는 '시뮬레이션' 유형이므로 문제에서 시키는 그대로 해야 함에 유의한다.
  2. 컨베이어 벨트의 길이는 2N, 로봇이 올라갈 수 있는 길이는 N임을 알아낸다.
  3. [1]단계에서 벨트는 마지막 부분을 떼어서 맨앞으로 붙이고,
    로봇은 같은 방식이지만 마지막 칸의 경우 즉시 로봇을 내린다 하였으므로 로봇을 없애준다.
  4. [2]단계에서 가장 먼저 벨트에 올라간 로봇부터 이동 가능 여부를 살펴보므로 for문을 뒤에서부터 돌려
    로봇이 존재하고, 다음 칸에 로봇이 없고, 다음 칸의 내구도가 존재한다면 로봇을 옮기고 내구도도 깎고 내구도가 0이 될 경우, K의 값을 -1 해준다.
  5. [3]단계에서는 가장 앞 칸의 내구도가 0이 아니면 로봇을 올리고, 내구도를 깎고, 내구도가 0이 될 경우 K에 -1을 해준다.
  6. [4]단계에서는 여태 깎은 K의 값이 0이하이면 과정을 종료시킨다.
N, K = map(int, input().split())
belt = list(map(int, input().split()))
robot = [0]*N

turn = 0
while True:
    turn += 1

    # [1] 벨트가 각 칸 위에 있는 로봇과 함께 한 칸 이동한다.
    belt = [belt.pop()] + belt
    robot = [0] + robot[:-2] + [0]

    # [2] 한 칸 이동 가능하다면 이동
    for i in range(N-2, -1, -1):
        if robot[i] and not robot[i+1] and belt[i+1]:
            robot[i] = 0
            robot[i+1] = 1
            belt[i+1] -= 1	# 내구도 깎기
            if belt[i+1] == 0:
                K -= 1

    # [3] 올리는 위치에 내구도가 0이 아니면 로봇을 올린다.
    if belt[0]:
        robot[0] = 1
        belt[0] -= 1	# 내구도 깎기
        if belt[0] == 0:
            K -= 1

    # [4] 내구도가 0인 칸의 개수가 K개 이상이면 과정을 종료한다.
    if K <= 0:
        print(turn)
        break

이해가 되지 않는 부분이 있으면 질문 주세요. 감사합니다.

728x90