본문 바로가기
Algorithm/Simulation

[파이썬] SWEA 5648 : 원자 소멸 시뮬레이션 (TEST)

by 베짱이28호 2025. 4. 12.

[파이썬] 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}")

코멘트

  • .

댓글