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)에 이 처리를 해주지 않아서 문제를 정확하게 풀지 못하였다.
다음부턴 문제에서 주어진 조건을 모든 과정(함수)에서 정상적으로 반영하고 있는지 확인하는 습관을 들여야겠다.
배운 점 및 느낀 점
- 구현 및 시뮬레이션 문제는 문제의 조건을 하나라도 놓치지 않도록 꼼꼼하게 읽자. 주석까지 미리 적어놓으면 좋을듯함.
- 큐를 사용해야할 때는 일반 리스트보다 deque 사용을 지향하자.
- 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 |