문제 링크 : https://www.acmicpc.net/problem/20055
최근 코딩테스트 트렌드가 문제 이해, 독해 능력을 기반으로한 구현 문제를 많이 출제하는 것 같다. 2021 하반기 네이버 코딩테스트 2번 문제도 구현 문제였다. 이런걸 코딩 "피지컬 문제"라고 하기도 한다.
문제 이해가 쉽지 않은 문제였고 꽤 피지컬을 요하는 문제였던 것 같다.
from collections import deque 를 통해 덱 자료구조를 사용할 수 있다. 컨베이어 벨트가 회전한다는 문장을 보고 deque의 rotate 메서드를 사용하면 좋을 것 같다는 생각이 들어, deque로 문제를 해결했다.
그리고 처음에 deque 안에 tuple을 넣어 사용했는데, 요새 학교 수업 때문에 C++스럽게 생각했던것 같다.. 파이썬의 tuple 원소는 변경이 불가능하다.
import sys from collections import deque N, K = map(int, input().split()) s = list(map(int, sys.stdin.readline().split())) belt = deque([]) countingZero = 0 for x in s: # 칸에 로봇이 없음, 내구도 belt.append([False, x]) step = 0 while True: step += 1 # 1.벨트 회전 belt.rotate(1) # - 내리는 위치에 도달하면 내림 if belt[N-1][0]: belt[N-1][0] = False # 2.이동할 수 있다면 이동 for i in reversed(range(2*N)): # 로봇이 없는 벨트는 이동 고려할 필요없음 if not belt[i][0]: continue next = i+1 if i == 2*N-1: next = 0 # 로봇이 없고, 내구도가 1 이상이라면 이동. if not belt[next][0] and belt[next][1] >= 1: belt[next][0] = True belt[next][1] -= 1 belt[i][0] = False if belt[next][1] == 0: countingZero += 1 # 내리는 곳이면 내림. if next == N-1: belt[next][0] = False # 3. 올리기 if not belt[0][1] == 0: belt[0][0] = True belt[0][1] -= 1 if belt[0][1] == 0: countingZero += 1 # 4. 과정 종료 if countingZero >= K: break print(step)