본문 바로가기
Algorithm/Data Structures

[파이썬] SWEA 5653 : 줄기세포배양(test)

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

[파이썬] SWEA 5653 : 줄기세포배양(test)


풀이

방향성 생각

  • 힙을 사용해서 매 시각마다 이벤트를 처리하지 않고, 필요한 시점에만 이벤트를 계산하기.
  • 시간에 대해서는 최소힙을 사용한다.
  • 생명력 수치에 대해서는 최대힙을 사용한다.
  • 배열의 크기는 정해지지 않았으니, set을 사용해서 방문처리를 한다.

 

전체코드

import heapq as hq

dires = [(1,0),(0,1),(-1,0),(0,-1)]

TC = int(input())
for tc in range(1,TC+1):

    H,W,T = map(int,input().split())
    arr = [list(map(int,input().split())) for _ in range(H)]

    V = set()
    heap = []
    live = []

    # 시작점을 힙에 추가, 방문 추가, 생명 주기 관리해주기기
    for y in range(H):
        for x in range(W):
            if arr[y][x]:
                V.add((x,y))
                life = arr[y][x]
                hq.heappush(heap,(0,-life,1,x,y))
                live.append((0, life))

    while heap:

        # 현재 시각이 t보다 커지면 탈출하기
        if heap[0][0] >= T:
            break

        # 시간, 생명력 수치, 상태, x좌표, y좌표
        t,val,state,x,y = hq.heappop(heap)

        # 비활성 상태인 경우, val 시간 후후
        if state == 1:
            hq.heappush(heap,(t+abs(val),val,2,x,y))

        # 활성 상태인 경우, 주변에 퍼뜨린다. t+1시점에 추가 (최대힙이라서 먼저 뽑힌 세포가 먼저 퍼뜨린다다)
        elif state == 2:

            for dx,dy in dires:
                nx,ny = x+dx,y+dy
                if (nx,ny) not in V:
                    V.add((nx,ny))
                    hq.heappush(heap,(t+1,val,1,nx,ny))
                    live.append((t+1, -val))

    # 시간 조건에 맞는애만 뽑기기
    answer = 0
    for t0,life in live:
        if T < t0 + 2*life:
            answer += 1

    print(f"#{tc} {answer}")

코멘트

  • 시뮬레이션보단 힙을 쓰는게 좀 더 의도에 맞는 풀이가 아니었나..

댓글