20055. 컨베이어벨트 위의 로봇 문제 바로가기
해결 방법
컨테이너의 회전하는 것을 올라가는 위치 변수 up
과 내려가는 위치 변수 down
을 조절하여 구현하였습니다.
up
과 down
의 차이는 N이라는 점을 고려하여 N 사이의 로봇 이동(밑에 문제 인용부분에서의 2번 과정!)만 주의하면 좋을 것 같습니다.
회전할 경우 container 리스트에 up, down의 위치 변화를 그림을 통해 살펴보겠습니다.
회전할 때 up의 위치와 down의 위치 모두 - 1이동하고 값이 음수를 가질 때 len(container) - 1
의 인덱스로 수정해주면 됩니다.
초반에 문제를 잘못 이해했었습니다.
문제에서 구해야하는 단계를 아래 1번, 2번, 3번, 4번 중 몇번째에 멈추는지를 물어보는걸로 잘못 이해했었습니다. 실제로!! 구해야하는 단계란 1번 ~ 4번의 과정이 한번 실행되면 1단계! 2번 반복되면 2단계를 출력하면 되는 거였습니다. 혹시 문제에 대해 저와 같이 헷갈리는 분 계시면 참고하세요~ 또는 댓글 남겨주세요 :)
- 벨트가 한 칸 회전한다.
- 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다.
- 로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.
- 올라가는 위치에 로봇이 없다면 로봇을 하나 올린다.
- 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.
종료되었을 때 몇 번째 단계가 진행 중이었는지 구해보자.
구현한 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
N, K = map(int, input().split())
container = list(map(int, input().split())) # 컨테이너의 내구도를 저장할 리스트
for i in range(2 * N):
container[i] = [container[i], 0]
# container[i] = [i칸의 내구도, 로봇유무] => 로봇이 있으면 -1, 없으면 0
step = 0 # 출력할 변수, 몇 단계 진행중인지 카운트할 변수
up = 0 # 올라가는 위치 인덱스
down = N - 1 # 내려가는 위치 인덱스
while True:
step += 1
# 1. 벨트가 한칸 회전한다.
up -= 1
if up < 0: up = 2 * N - 1
if container[down][1] == -1: # 로봇이 있는 경우 내리기
container[down][1] = 0
down -= 1
if down < 0: down = 2 * N - 1
# 2. 로봇을 이동한다.
move = down
for _ in range(N):
if container[move][1] == -1: # 로봇이 있는 경우
if move == down: # 내리는 위치이기에 로봇은 땅으로 내려가는 경우
container[move][1] = 0
else:
# 로봇이 옆 칸으로 이동하는 경우
next_move = move + 1
if next_move == 2 * N: next_move = 0
# 이동할 옆 칸에 로봇이 없고 내구도가 1 이상인 경우 이동하기
if container[next_move][1] == 0 and container[next_move][0] != 0:
container[move][1] = 0
container[next_move][0] -= 1
container[next_move][1] = -1
move -= 1
if move < 0: move = 2 * N - 1
# 3. 가능하다면 로봇을 올린다.
if container[up][1] == 0 and container[up][0] != 0:
container[up][0] -= 1
container[up][1] = -1 # 로봇 있음 체크
cnt = 0
for n in range(2 * N):
if container[n][0] == 0: # 내구도가 0인 칸 세기
cnt += 1
if cnt >= K:
break
print(step)