코딩테스트 연습문제를 풀던 도중에 아래와 같은 문제가 발생했습니다.
'NoneType' object is not iterable
코드 어디에 문제가 있었는지 확인해봤는데 다음과 같은 문제가 있었습니다.
의심스러운 부분 U_list와 nU_list의 타입을 출력했습니다.
from collections import deque
U_list =deque("ABCDEFGHIJKLMNOPQRSTUVWXYZ") # U_list는 대문자 알파벳으로 이루어진 deque 리스트이다.
nU_list=U_list.rotate(-4) #nU_list는 U_list를 4번 왼쪽으로 회전시킨 deque 리스트를 대입한 것이다.(착각)
print(type(U_list))
print(type(nU_list))
실행결과
<class 'collections.deque'>
<class 'NoneType'>
U_list의 타입은 ‘deque’가 맞는데 nU_list의 타입이 ‘NoneType’이 나왔습니다.
nU_list의 타입도 ‘deque’ 가 되어야 맞을 것 같은데 왜 ‘NoneType’이 나왔을까요?
결과적으로 deque에서 rotate 메소드의 원리를 착각했습니다. nU_list = U_list.rotate(-4)
를 했을 때 rotate 메소드를 이용하면 nU_list가 U_list에서 왼쪽으로 4번 회전한 값이 될 거라고 착각했습니다.
※ rotate는 기존의 deque리스트 값을 변경하는 메서드이지 회전한 deque리스트를 리턴하는 메서드가 아닙니다.
정리하면 rotate 메서드는 리턴값이 없는 함수이며, U_list.rotate(-4)는 U_list에서 왼쪽으로 4번 회전한 새로운 deque리스트를 의미하는 것이 아니라 U_list의 값을 왼쪽으로 4번 회전시킨다는 의미입니다.
예시
from collections import deque
U_list =deque("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
U_list.rotate(-4)
print(U_list)
실행 결과
deque(['E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'A', 'B', 'C', 'D'])
실행 결과 U_list의 값이 왼쪽으로 4번 회전된 것을 알 수 있습니다.
※참고: deque 정리하기
아래처럼 코드를 작성해서 문제를 해결했습니다.
해결
#deque의 rotate이용
from collections import deque
def solution(s, n):
s_list = deque(s)
U_list =deque("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
u_list =deque("abcdefghijklmnopqrstuvwxyz")
nU_list=U_list.rotate(-n)
nu_list=u_list.rotate(-n)
#deque로 전환해서 n번 반대방향으로 회전한 값을 반환
for i,j in enumerate(s_list):
#알파벳이 대문자라면
if j in U_list:
U_index=U_list.index(j)
U_list.rotate(-n)
s_list[i]=U_list[U_index]
U_list.rotate(n)
#알파벳이 소문자라면
elif j in u_list:
u_index=u_list.index(j)
u_list.rotate(-n)
s_list[i]=u_list[u_index]
u_list.rotate(n)
answer = ''.join(s_list)
return answer