문제
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRFInKex8DFAUo
설계
- 원자들이 같은 행 또는 열에 있을 경우 부딪힌다.
- 원자들이 서로 만나는 지점은 0.5만큼씩 이동했을 때 부딪힌다.
- 1. 좌표 2배로 늘려 정수 형태로 변경 / 범위도 -1000~1000 -> -2000~2000으로 늘어난다.
- 2. 좌표가 같을 경우 해당 좌표를 따로 저장해준다.
- 3. 저장된 리스트에서 좌표를 삭제하면서 에너지에 더해준다.
주의
- 삭제시 index 범위가 달라질 수 있으므로 문제에서 주어지는 N값이 아닌 len(arr)을 이용했다.
- 보통 행렬에서 x를 위/아래, y를 좌/우로 생각하며 사용하는 편이다.
이번 문제에서는 xy축을 기준으로 생각하는 것을 놓쳐 문제를 푸는데 애를 먹었다.
T = int(input())
for tc in range(1, T+1):
N = int(input())
arr = [list(map(int, input().split())) for _ in range(N)] # x, y 방향, 에너지K
energy = 0
# 0. 좌표값 2배로 늘리기
for i in range(len(arr)):
arr[i][0] *= 2
arr[i][1] *= 2
# 1. 좌표 이동
dx, dy = [1, -1, 0, 0], [0, 0, -1, 1] # 좌표 숫자 주의!!!: 상 하 좌 우
for _ in range(4002): # 범위 증가 -2000 ~ 2000
for i in range(len(arr)): # 나중에 arr에서 삭제되는 경우가 있으므로 N이 아닌 len(arr)으로 해주자.
arr[i][0] += dy[arr[i][2]] # y 좌표 (행렬의 y가 아니라 축의 y 이다.)
arr[i][1] += dx[arr[i][2]] # x 좌표 (행렬의 x가 아니라 축의 x 이다.)
visit = set()
del_list = set()
# 2. 좌표 중복되면 삭제 후보
for i in range(len(arr)):
if (arr[i][0], arr[i][1]) in visit: # 만약 현재 좌표가 이미 있다면
del_list.add((arr[i][0], arr[i][1])) # 좌표가 있다면 삭제 리스트에 에너지와 방향을 넣어준다.
visit.add((arr[i][0], arr[i][1]))
# 3. 삭제 리스트에 있으면 삭제
for i in range(len(arr)-1, -1, -1): # index 오류 방지를 위해 뒤에서 부터 확인하면서 빼준다.
if (arr[i][0], arr[i][1]) in del_list: # 만약 삭제해야 할 좌표 중에 있다면
energy += arr[i][3]
arr.pop(i) # 원자를 소멸시켜 다음 이동때 또 부딪히는 일이 없도록 한다.
print(f'#{tc} {energy}')
'PS (Problem Solving) > SW Expert Academy' 카테고리의 다른 글
[SWEA] 1926. 간단한 369게임 - 파이썬 (0) | 2023.01.18 |
---|---|
[SWEA] 1859. 백만 장자 프로젝트 - 파이썬 (0) | 2023.01.17 |
[SWEA] 4012. 모의 SW 역량테스트 - 요리사 (0) | 2022.04.07 |
[SWEA] 4008. 모의 SW 역량테스트 - 숫자 만들기 (0) | 2022.04.07 |
[SWEA] 1952. 모의 SW 역량테스트 - 수영장 (0) | 2022.04.07 |