Posts [baekjoon] 20055. 컨베이어벨트 위의 로봇 (python)
Post
Cancel

[baekjoon] 20055. 컨베이어벨트 위의 로봇 (python)

20055. 컨베이어벨트 위의 로봇 문제 바로가기

해결 방법

컨테이너의 회전하는 것을 올라가는 위치 변수 up내려가는 위치 변수 down을 조절하여 구현하였습니다.

updown의 차이는 N이라는 점을 고려하여 N 사이의 로봇 이동(밑에 문제 인용부분에서의 2번 과정!)만 주의하면 좋을 것 같습니다.

회전할 경우 container 리스트에 up, down의 위치 변화를 그림을 통해 살펴보겠습니다.

컨베이어 로봇 설명 그림 1 컨베이어 로봇 설명 그림 2

회전할 때 up의 위치와 down의 위치 모두 - 1이동하고 값이 음수를 가질 때 len(container) - 1의 인덱스로 수정해주면 됩니다.


초반에 문제를 잘못 이해했었습니다.

문제에서 구해야하는 단계를 아래 1번, 2번, 3번, 4번 중 몇번째에 멈추는지를 물어보는걸로 잘못 이해했었습니다. 실제로!! 구해야하는 단계란 1번 ~ 4번의 과정이 한번 실행되면 1단계! 2번 반복되면 2단계를 출력하면 되는 거였습니다. 혹시 문제에 대해 저와 같이 헷갈리는 분 계시면 참고하세요~ 또는 댓글 남겨주세요 :)

  1. 벨트가 한 칸 회전한다.
  2. 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다.
    1. 로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.
  3. 올라가는 위치에 로봇이 없다면 로봇을 하나 올린다.
  4. 내구도가 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)
This post is licensed under CC BY 4.0 by the author.

[baekjoon] 19237. 어른상어 (python)

[baekjoon] 20056. 마법사 상어와 파이어볼 (python)

Comments powered by Disqus.