※ 이 풀이법은 PyPy3으로 통과된 방법으로, Python3으로는 '시간 초과'가 뜨는 코드입니다
개인적인 "구현 연습"을 위해 외부 라이브러리 사용 없이 빡구현 한 코드입니다.
deque의 rotate를 사용하면 회전하는 컨베이어 벨트를 바로 만들 수 있었겠지만,
구현 연습을 위해 직접 구현했다.
또한 0의 개수를 셀 때도, count 함수를 사용하지 않고 직접 구현했다.
문제에서 주어진 컨베이어 벨트 작동 순서는 크게 3가지로,
1. 회전하고
2. 이동하고
3. 올린다
를 내구도의 0 개수가 K개 이상이 될 때까지 반복
라고 생각할 수 있다.
위의 세 과정을 모두 지나야 한 단계를 지났다고 생각한다.
따라서, 회전 / 이동 / 올림 을 각각 구현하고, 내구도 0의 개수를 세는 과정을 순서대로 구현했다.
N, K = map(int, input().split())
durability = [int(i) for i in input().split()]
robot = [0] * N
step = 0
# 0의 갯수가 K 이하일때까지 반복!
while True:
nDu = [] * (2 * N) # 초기화
# 회전 + 로봇이 있는 칸이라면 같이 회전
for i in range(N-1, -1, -1):
if robot[i] == 1 and i < N-1:
robot[i+1] = 1
robot[i] = 0
robot[-1] = 0
nDu.append(durability[-1])
for i in range((2*N)-1):
nDu.append(durability[i])
durability = nDu
# 로봇 이동
for i in range(N-1, -1, -1):
if robot[i] == 1 and robot[i+1] == 0 and durability[i+1] >= 1:
robot[i+1] = 1
robot[i] = 0
durability[i+1] -= 1
robot[-1] = 0 # 언제든지 로봇이 '내리는 위치'에 도달하면 그 즉시 내린다.
# 올리기
if durability[0] != 0:
durability[0] -= 1
robot[0] = 1
# 0 개수 확인
step += 1
cnt = 0
for d in durability:
if d == 0:
cnt += 1
if cnt >= K:
print(step)
break
풀이과정
- 회전: 새로운 리스트 nDu를 만들어 제일 마지막 요소를 nDu[0]에 넣고,
0번째 ~ 2N-1번째까지를 순서대로 nDu[1]~[2N]에 넣음
1-1. 컨베이어 벨트 위에 로봇이 있는 경우: 로봇의 위치를 나타내는 리스트 robot에 1이 있다면, 옆으로 이동
( 이 때 <이동>과 다른 점은, 컨베이어 벨트 전체가 움직이는 것이므로 이동해도 내구도의 변화 x ) - 이동: robot 리스트의 1을 원래자리는 다시 0으로 바꿔주고, 옆자리는 1로 바꿔줌
옆자리의 내구도도 -1 해줌 - 올림: 제일 첫번째 자리의 내구도를 -1 해주고, robot리스트의 첫 번째 자리도 1로 바꿈
- 확인: 위 세 과정이 끝났다면 step을 +1 해주고,
내구도를 담는 리스트를 돌며 0의 개수를 세서 K개 이상이면 step을 출력함
내구도를 담는 리스트를 돌며 0의 개수를 세서 K개 미만이면 1~3과정을 반복함
'코테연습문제' 카테고리의 다른 글
[Programmers/Python] 신규 아이디 추천 (0) | 2023.06.15 |
---|---|
[백준/Python] 1205 등수 구하기 (0) | 2023.06.15 |
[백준/Python] 20006 랭킹전 대기열 (1) | 2023.06.13 |
[백준/Python] 2852 NBA 농구 (0) | 2023.06.12 |
[백준/Python] 1224 스위치 켜고 끄기 (0) | 2023.06.10 |