광고
광고
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. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.
오류나 적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.
혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.
'코딩 문제해결 > 문제 풀이.SWEA' 카테고리의 다른 글
[SWEA 코딩] [모의 SW 역량테스트] 디저트 카페 - PYTHON #2105 (0) | 2020.12.20 |
---|---|
[SWEA 코딩] [모의 SW 역량테스트] 요리사 - PYTHON #4012 (0) | 2020.12.17 |
[SWEA 코딩] [모의 SW 역량테스트] 줄기세포배양 - PYTHON #5653 (0) | 2020.12.14 |
[SWEA 코딩] [모의 SW 역량테스트] 수영장 - PYTHON #1952 (1) | 2020.12.12 |
[SWEA 코딩] [모의 SW 역량테스트] 미생물 격리 - PYTHON # 2382 (0) | 2020.12.11 |