AngelPlayer`s Diary

링크

https://www.acmicpc.net/problem/20055

 

 

 

 

문제 해석

입력
첫 번째 줄 : n k
  n : 컨베이어 벨트 길이
  k : 내구도가 0인 위치의 한계값
두 번째 줄 : 벨트 내구도


출력 : 종료 시 단계, 1단계부터 시작함

 

문제에서 참고할 설명
1번칸 : 컨베이어 벨트에 올리는 위치
N번칸 : 컨베이어 벨트에서 내리는 위치

내구도 깎이는 기준
  1) 로봇을 올리는 위치에 올림
  2) 로봇이 칸 이동을 진행함

 

시뮬레이션 순서
1) 벨트 한 칸 회전 (로봇이 같이 움직임)
2) 올라탄 로봇 순서대로 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동
   이동하려면 해당 칸에 로봇이 없으며, 내구도가 1이상이어야 함
3) 올리는 위치의 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올림
4) 내구도가 0인 칸의 개수가 k개 이상이면 종료

 

 

 

 

풀이 & 코드 해석

시뮬레이션이므로 문제의 요구사항을 정확히 이해한 후 그에 맞춰서 구현하는 것이 중요합니다.

 

 

 

코드

def rotate():
    global n
    # 벨트 돌리기
    temp = belt[0][n - 1]

    for i in range(n - 1, 0, -1):
        belt[0][i] = belt[0][i - 1]

    belt[0][0] = belt[1][0]

    for i in range(0, n - 1):
        belt[1][i] = belt[1][i + 1]
    belt[1][n - 1] = temp


    # 로봇 돌리기
    for i in range(n - 1, 0, -1):
        robot[i] = robot[i - 1]
    robot[0] = False


def drop():
    global n
    if robot[n - 1] == True:
        robot[n - 1] = False


def move():
    global n, dur_cnt
    for i in range(n - 2, -1, -1):
        if robot[i + 1] == True or belt[0][i + 1] == 0:
            continue

        if robot[i] == True:
            robot[i + 1] = True
            belt[0][i + 1] -= 1
            robot[i] = False

            if belt[0][i + 1] == 0:
                dur_cnt += 1


def up():
    global dur_cnt
    if robot[0] == True or belt[0][0] == 0:
        return

    robot[0] = True
    belt[0][0] -= 1

    if belt[0][0] == 0:
        dur_cnt += 1


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

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

belt = [[0] * n for _ in range(2)]
robot = [False] * n

cnt = 0
for i in range(n):
    belt[0][i] = durability[cnt]
    cnt += 1

for i in range(n - 1, -1, -1):
    belt[1][i] = durability[cnt]
    cnt += 1

dur_cnt = 0 # 내구도가 0인 벨트 개수
ans = 1

while 1:
    # print("+++++++++: ", ans)
    # 벨트 회전 & 로봇 회전
    rotate()
    # 내리는 칸에 로봇 있는지 체크
    drop()
    # print("rotate")
    # print(belt)
    # print(robot)

    # 모든 로봇 한 칸 이동
    move()
    # 내리는 칸에 로봇 있는지 체크
    drop()
    # print("move")
    # print(belt)
    # print(robot)


    # 로봇 올리기
    up()
    # print("up")
    # print(belt)
    # print(robot)

    dc = 0
    # for i in range(2):
    #     for j in range(n):
    #         if belt[i][j] == 0:
    #             dc += 1
    # 내구도 0인 벨트 개수가 k개 이상이면 break
    if dur_cnt >= k:
        break

    ans += 1

print(ans)

 

 

 

 

발생한 문제 & 해결 방안

사용하는 배열이 많아서 중간에 값이 제대로 나오지 않아 엉키는 문제가 있었다.

 

매 함수를 완성하고 코드가 정확히 동작하는지 확인하자.

 

 

 

 

 

 

해당 코드는 에디터가 코드 연습을 위해 직접 작성하였습니다.

혹시 오류가 있거나 더 좋은 코드 방향성을 아시는 분은 댓글로 남겨주시면 감사하겠습니다!

python source : https://github.com/ssh5212/conding-test-practice

java source : https://github.com/ssh5212/coding-test-java

공유하기

facebook twitter kakaoTalk kakaostory naver band