Algorithm/Implementation

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

킹우현 2023. 10. 5. 15:22

 

20055번: 컨베이어 벨트 위의 로봇

길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부

www.acmicpc.net

n, k = map(int,input().split())

status = list(map(int,input().split()))

data_top = [0]*n
data_bottom = [0]*n
status_top = status[:n]
status_bottom = list(reversed(status[n:]))

answer = 0

def count_zero(): # 내구성이 0인 칸의 개수를 구하는 함수
    count = 0
    for i in range(n):
        if status_top[i] == 0:
            count += 1
        if status_bottom[i] == 0:
            count += 1
    return count

def rotate(): # 벨트를 한칸 회전하는 함수
    global data_top
    global data_bottom
    global status_top
    global status_bottom
    data_top_poped = data_top.pop()
    data_bottom_poped = data_bottom.pop(0)
    data_top = [data_bottom_poped] + data_top
    data_bottom = data_bottom + [data_top_poped]

    status_top_poped = status_top.pop()
    status_bottom_poped = status_bottom.pop(0)
    status_top = [status_bottom_poped] + status_top
    status_bottom = status_bottom + [status_top_poped]

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

def move(): # 벨트에 올라간 로봇을 이동시키는 함수
    for i in range(len(data_top)-1,-1,-1):
        if i == (len(data_top)-1) and data_top[i] == 1 and data_top[i+1] == 0 and status_top[i+1] >= 1:
            data_top[i] = 0
            status_top[i+1] -= 1
        else:
            if data_top[i] == 1 and data_top[i+1] == 0 and status_top[i+1] >= 1:
                data_top[i+1] = 1
                data_top[i] = 0
                status_top[i+1] -= 1  
    if data_top[-1] == 1:
        data_top[-1] = 0

def put_robot(): # 올리는 위치에 로봇을 올리는 함수
    if data_top[0] == 0 and status_top[0] >= 1:
        data_top[0] = 1
        status_top[0] -= 1

while True:
    answer += 1

    rotate()
    move()
    put_robot()

    if count_zero() >= k:
        break

print(answer)

이번 문제는 주어진 컨베이어 벨트가 반복적으로 움직이고, 로봇들이 자체적으로 이동한다는 가정하에 내구도가 0인 칸이 k개 이상이 될 때의 단계를 구하는 문제이다.

 

먼저 본인은 1차원 리스트보다 상위 벨트와 하위 벨트로 나누어서 생각하는 것이 더 편할 것 같아서 상하벨트로 두 개의 1차원 리스트를 선언하였다.(내구도 정보도 마찬가지)

 

그리고 벨트를 한 칸 움직이는 함수(rotate), 벨트 위의 로봇이 움직이는 함수(move), 올리는 위치에 로봇을 올리는 함수(put_robot), 내구도가 0인 칸의 개수를 구하는 함수(count_zero)를 선언하여 구현하였다.

 

하지만 여기서 한 가지 실수를 하게 된 점이 있는데, "언제든지 로봇이 내리는 위치에 도달하면 그 즉시 내린다." 는 조건이다.

 

물론 이 조건을 고려해서 벨트 이동 시(rotate)에 로봇을 내려주었는데, 로봇이 움직일 때(move)에 이 처리를 해주지 않아서 문제를 정확하게 풀지 못하였다.

 

다음부턴 문제에서 주어진 조건을 모든 과정(함수)에서 정상적으로 반영하고 있는지 확인하는 습관을 들여야겠다.

 

배운 점 및 느낀 점

  1. 구현 및 시뮬레이션 문제는 문제의 조건을 하나라도 놓치지 않도록 꼼꼼하게 읽자. 주석까지 미리 적어놓으면 좋을듯함.
  2. 큐를 사용해야할 때는 일반 리스트보다 deque 사용을 지향하자.
  3. deque에는 리스트를 회전할 때 사용하는 deque.rotate(n) 함수가 존재한다.

'Algorithm > Implementation' 카테고리의 다른 글

[백준 7682번] 틱택토  (0) 2023.10.20
[백준 2578번] 빙고  (0) 2023.10.06
[백준 1986번] 체스  (0) 2023.09.30
[백준 17140번] 이차원 배열과 연산  (0) 2023.09.19
[백준 20057번] 마법사 상어와 토네이도  (1) 2023.09.07