본문 바로가기

[python] RuntimeError: deque mutated during iteration

곰곰킴 2021. 4. 20.

 

오류 상황

 

프로그래머스의 디스크 컨트롤러를 풀던 도중

 

programmers.co.kr/learn/courses/30/lessons/42627

 

코딩테스트 연습 - 디스크 컨트롤러

하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다. 예를

programmers.co.kr

 

deque 반복문을 돌며 pop 하려 할 때 오류가 나왔다.

 

js = deque(jobs)
for s, t in js:
	if s <= time:
		js.popleft()
		heapq.heappush(heap, (t, s))

 

 

 

 

오류 원인

 

파이썬의 deque 같은 경우 자바의 list처럼

 

deque의 반복문을 돌릴 때내용이 변경되거나 사이즈가 변할 때 나타난다.

 

 

 

 

해결책 1

 

deepcopy하여 새로운 객체로 루프를 돌리고 원래 deque의 내용을 변경한다.

 

import copy

js = deque(jobs)
cnt = 0
for s, t in copy.deepcopy(js):
	if s <= time:
		js.popleft()
		heapq.heappush(heap, (t, s))
	

 

 

해결책 2

 

루프를 돌며 변경할 부분을 저장해놓은 후 루프가 끝난 후 처리한다.

 

 

js = deque(jobs)
cnt = 0
for s, t in js:
	if s <= time:
		cnt += 1
		heapq.heappush(heap, (t, s))

for i in range(cnt):
	js.popleft()

 

cnt로 없앨 부분만큼을 기록한 후 이후에 처리한 모습이다.

댓글