미소를뿌리는감자의 코딩
[백준 2024/02/20] 20055번 컨베이어 벨트 위의 로봇 본문
https://www.acmicpc.net/problem/20055
1. 접근 방법
컨베이어의 위 아래로 나누어서, 구분을 해주었다.
robots라는 list를 만들어 주어서, 로봇의 위치(인덱스 값)을 저장해주었다. 이를 통해 로봇이 컨베이어 벨트의 끝에 도달했는지 혹은 앞에 다른 로봇이 있는지 알아볼 수 있었다.
이후 함수는 step1, step2, step3로 나누어서 문제에 적혀있는대로 코드를 작성해 주었다.
+ remove_indices 라는 list를 만든 이유:
처음에는, 그냥 로봇이 끝에 도달했을 때, 해당 robots.pop(n-1) 을 바로 해주었었다. 하지만, for i in range (len(robots)) 에서 index out of range error가 발생하였다. 그 이유는, pop을 하게 되어, list의 길이가 달라져 없는 곳에 접근하려고 했기 때문이다.
따라서, pop을 하고자 하는 index를 remove_indices라는 list에 저장해두고, 후에 한번에 pop을 해주었다.
주의해야할 점은, 뒤에서 부터 pop을 해야지 index out of range error가 발생하지 않는다.
for p in reversed(remove_indices):
robots.pop(p)
step1 : 벨트가 각 칸 위에 이는 로봇과 함께 한 칸 회전
step2 : 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동, 이동할 수 없다면 가만히
- 로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.
step3 : 올리는 위치에 있는 칸의 내구도가 0 이 아니면 올리는 위치에 로봇을 올림
step4 : 내구도가 0 인 칸의 개수가 k개 이상이라면 과정을 종료 그렇지 않다면 1번으로 돌아감 -> while 문의 탈출 조건
2. 코드
def step1(robots):
down_list.append(up_list.pop())
up_list.insert(0, down_list.pop(0))
remove_indices = []
for i in range(len(robots)):
if robots[i] + 1 >= n-1:
remove_indices.append(i)
continue
robots[i] += 1
for p in reversed(remove_indices):
robots.pop(p)
return robots
def step2(robots):
remove_indices = []
for i in range(0, len(robots)):
if robots[i] + 1 not in robots and robots[i] + 1 < n:
next_position = robots[i] + 1
if up_list[next_position] > 0:
up_list[next_position] -= 1
robots[i] = next_position
if next_position == n-1:
remove_indices.append(i)
for i in sorted(remove_indices, reverse=True):
robots.pop(i)
def step3(robots):
if up_list[0] != 0:
robots.append(0)
up_list[0] -= 1
if __name__ == '__main__':
n, k = map(int, input().split())
durability = list(map(int, input().split()))
up_list = []
down_list = []
robots = []
for i in range(n):
up_list.append(durability[i])
for i in range(2 * n - 1, n - 1, -1):
down_list.append(durability[i])
steps = 0
while up_list.count(0) + down_list.count(0) < k:
steps += 1
step1(robots)
step2(robots)
step3(robots)
print(steps)
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준 2024/02/20] 17779번 게리맨더링 2 (1) | 2024.02.20 |
---|---|
[백준 2024/02/20] 11559번 Puyo Puyo (0) | 2024.02.20 |
[백준 2024/02/20] 1244번 스위치 켜고 끄기 (0) | 2024.02.20 |
[백준 2024/02/19] 16398번 행성 연결 (1) | 2024.02.19 |
[백준 2024/02/19] 1647번 도시 분할 계획 (1) | 2024.02.19 |