from collections import deque
def solution(n, m, image):
answer = 0
q = deque()
img = [(im, (i, idx)) for i, img in enumerate(image) for idx, im in enumerate(img)]
while img:
has = False
if not q:
pop = img.pop(0)
q.append(pop)
else:
pop = img.pop(img.index(q[-1]))
for im in img:
if im[0] == pop[0] and abs(im[1][0] - pop[1][0]) + abs(im[1][1] - pop[1][1]) < 2:
q.append(im)
has = True
if not has:
answer += 1
q.clear()
return answer
q = deque()
변수명
도 정말 중요한 이슈인데요. 변수명은 가독성에 매우 중요한 요소 중 하나입니다. 이때, 변수명의 길이에 대해서 제 생각을 말씀드리면 변수명의 길이에 따라 가독성과 개발속도는 trade-off 관계에 있습니다. 변수명의 길이가 짧아지면 개발속도가 빨라질 수 있어요. 당연한 얘기죠. 또 사소하지만 파일 용량이 줍니다. 반면 변수명이 길어지면 일반적으로 가독성이 증가합니다. 그래서 이 사이의 균형을 맞추는 게 중요하다고 생각해요.
이때 q
는 지나치게 짧아요. 분명 우리는 저게 큐를 의미한다는 변수라는 것을 알지만 제 3자는 사고
를 해야해요. 저 q
는 큐일 수도 있지만, 질문일 수도 있고, 여왕일지도 모르거든요. 한 번에 이해할 수 있게 조금만 길게 하면 어떨까요?
img = [(im, (i, idx)) for i, img in enumerate(image) for idx, im in enumerate(img)]
파이썬에서 이중 list comprehension은 조심스럽게 써야 하는 것 같아요. 저게 가독성을 꽤 낮추는 요소라 파이썬을 많이 써본 사람이 아니면 이해하기 힘들어요. 조금 줄을 늘릴지언정 반복문을 통해 img
를 초기화해도 좋을 것 같아요. i
와 idx
, im
과 img
비슷한 변수명이 뒤섞여 보기가 힘든 것 같아요. 최대한 내 코드에 대한 사용자의 인지부하를 줄여줘야 합니다.
pop = img.pop(0)
말씀하신 대로, 파이썬에서 list
의 pop(0)
연산은 효율적이지 않습니다. 첫 번째 원소를 버리고 포인터 위치로 나머지 N-1
의 인자를 하나씩 다 당겨야 하기 때문에... list.pop(0)
은 반드시 원소의 개수가 적다는 가정이 있을 때에만 가볍게 쓰는 게 좋을 것 같아요.
아하 감사합니다 ㅎㅎ 다시 풀 때 참고하도록 할게요 시간내주셔서 감사해요