[파이썬] SWEA 5648 : 원자 소멸 시뮬레이션 (TEST)
풀이
방향성 생각
- 각 공이 충돌할 좌표를 계산하는 방식으로 효율적으로 풀 수 있다.
- 시뮬레이션으로 풀이.
- 각 공의 좌표를 *2를 해준다.
- (0,0)에서 오는 공이랑 (1,0)에서 오는 공이 서로 충돌한다 했을 떄, 충돌 지점은 0.5인데 이런 부분을 int로 관리해주기
- (0,0)과 (2,0)에서 오는 공이 (1,0)에서 충돌
- 각 시점에서 공의 좌표 -> 공의 정보를 리스트에 모두 저장하고, 리스트의 길이가 몇인지 관리해준다.
- 각 공을 이동시킨 후, 특정 좌표에 2개 이상의 공이 있으면 그 공의 에너지를 전부 더해주고 정보를 제거한다.
- info가 없어질 때 까지 반복하기
- 좌표를 벗어나면 각 공들은 다른 공과 충돌하지 않는다.
- 각 좌표를 벗어난 공들이 충돌하려면 그 진행방향과 직교하는 방향에서 와야하는데, 그러한 공은 존재하지 않는다.
전체코드
from collections import defaultdict as dd
dires = [(0,1),(0,-1),(-1,0),(1,0)]
inside = lambda x,y : -2000<=x<=2000 and -2000<=y<=2000
TC = int(input())
for tc in range(1,TC+1):
N = int(input())
infos = dd(list)
counting = dd(int)
for _ in range(N):
x,y,dire,energy = map(int,input().split())
infos[(2*x,2*y)].append((dire,energy))
counting[(2*x,2*y)] += 1
answer = 0
t = 0
while infos:
new_infos = dd(list)
new_counting = dd(int)
for (x,y),info in infos.items():
for dire,energy in info:
nx,ny = x+dires[dire][0], y+dires[dire][1]
if inside(nx,ny):
new_infos[(nx,ny)].append((dire,energy))
new_counting[(nx,ny)] += 1
for loc in new_counting:
if new_counting[loc] > 1:
answer += sum(info[-1] for info in new_infos[loc])
new_infos.pop(loc)
infos = new_infos
counting = new_counting
print(f"#{tc} {answer}")
코멘트
- .
'Algorithm > Simulation' 카테고리의 다른 글
[파이썬] SWEA 4013 : 특이한 자석 (test) (0) | 2025.04.10 |
---|---|
[파이썬] 프로그래머스 : 프렌즈 4블록 (레벨2) (0) | 2025.03.22 |
[파이썬] 백준 17822 : 원판 돌리기 (골드2) (0) | 2025.03.21 |
[파이썬] 프로그래머스 : 충돌 위험 찾기 (레벨2) (0) | 2025.03.19 |
[파이썬] 프로그래머스 : 행렬 테두리 회전하기 (레벨2) (0) | 2025.03.17 |
[자바] SWEA 6109 : 추억의 2048 게임 (D4) (0) | 2025.03.09 |
[파이썬] SWEA 5644 : 무선 충전 (TEST) (0) | 2025.03.09 |
댓글