x=[1,-1,0,0] #상 하 좌 우(문제에서는 위로 올라가는 경우를 +로 인식함)
y=[0,0,-1,1]
board = [[0]*4001 for _ in range(4001)]
# 배열, 크기가 4001x4001인 이유는 -1000 ~ 1000을 0 ~ 2000으로 바꾼 후,
# 2를 곱했기 때문(0.5초에 충돌하는 문제를 해결하기 위해 2를 곱했음)
T = int(input())
for tc in range(1,1+T):
n = int(input())
arr = [] # x(j),y(i),위치,에너지
for p in range(n):
ar = list(map(int,input().split()))
ar[0] = (ar[0]+1000)*2 # 위치 조정
ar[1] = (ar[1]+1000)*2 # 위치 조정
board[ar[1]][ar[0]] = ar[3]
arr.append(ar)
power = 0
while len(arr) != 0:
number = len(arr)
for qq in range(number):
q = arr.pop(0)
if 0 <= q[1]+x[q[2]] < 4001 and 0 <= q[0]+y[q[2]] < 4001: # 범위 제한
if q[3] == board[q[1]][q[0]]: # 충돌이 없었으면, 같은 값이어야 함
if board[q[1]+x[q[2]]][q[0]+y[q[2]]] == 0:
# 아무도 방문하지 않은 곳이면
board[q[1]][q[0]] = 0 # 이전 위치 초기화
q[0] = q[0]+y[q[2]] # 위치 수정
q[1] = q[1]+x[q[2]] # 위치 수정
board[q[1]][q[0]] = q[3] # 값을 넣어주고
arr.append(q) # 다시 리스트에 집어 넣기
else: # 이미 다른 원자가 한 곳이면
board[q[1] + x[q[2]]][q[0] + y[q[2]]] += q[3]
# 해당 위치에 자신의 원자 에너지 더해주고
board[q[1]][q[0]] = 0 # 이전 위치 초기화
# append 안 함 == 충돌해서 사라지기 때문
else: # 충돌 했었으면
power += board[q[1]][q[0]] # power에 충돌한 에너지 총합 더해주고
board[q[1]][q[0]] = 0 # 현재 위치 초기화
else: # 범위 넘어가면(무한대로 간다고 인식)
# 범위를 때까지 충돌 없으면 이 후에는 무한대로 넘어가도 만나는 경우 없음
board[q[1]][q[0]] = 0 # 현재 위치 초기화
print('#{} {}'.format(tc, power))

그 외

1. 배열은 한 번만 지정하면 됨, len(arr)이 0인 시점에는 초기화 되기 때문

 

2. 배열은 테스트케이스 안에 집어 넣으면 메모리 부족 발생

 

ps. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.

 

오류나 적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.

 

혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.