[파이썬/python] 백준 - 18405 경쟁적 전염

2025. 7. 7. 19:44·알고리즘
반응형

문제

https://www.acmicpc.net/problem/18405


문제 설명

  1.   N*N 크기의 시험관이 입력으로 들어온다.
  2. 시험관 배열에는 종류가 다른 바이러스들이 존재한다.
    1. 바이러스의 종류는 1~K번 중 하나에 속한다.
  3.   하루가 지날 때 마다 바이러스가 상,하,좌,우로 증식된다.
    1. 이 때 바이러스의 번호가 낮은 것 부터 증식한다.
    2. 다른 바이러스가 존재한다면, 그 위치로는 증식하지 않는다.
  4. S초가 지났을 때, Y,X 위치에 존재하는 바이러스를 출력한다.

 


풀이

너비 우선 탐색(BFS)는 먼저 방문한 위치들을 먼저 탐색한다. 즉 시작할 때 시험관에 존재하는 바이러스들을 오름차순으로 정렬시킨 후 큐에 입력한다면, 무조건 바이러스들은 낮은 번호부터 증식하게 될 것이다.

이러한 상황에서 입력으로 받은 S초까지 BFS를 진행하도록 구현했다.  

  1. 시험관 배열을 완전 탐색하여 바이러스들의 위치와 초기 시간을 queue 배열에 입력한다.
  2. queue 배열을 바이러스 종류 오름차순으로 정렬한 후, deque 구조로 변경한다.
  3. BFS 탐색을 통해 queue에서 꺼낸 데이터가 S초일 때 까지 탐색을 진행한다.
  4. y,x 위치의 바이러스 번호를 출력한다. 

코드

import sys
from collections import deque
input = sys.stdin.readline

n,k = map(int,input().split())

board = [list(map(int,input().split())) for _ in range(n)]

s,y,x = map(int,input().split())
y,x = y-1,x-1

queue = []
for i in range(n):
    for j in range(n):
        if board[i][j] != 0:
            queue.append((i,j,board[i][j],0))
        board[i][j] = [board[i][j],0]



queue = deque(sorted(queue, key = lambda x: x[2]))

dy = [0,1,0,-1]
dx = [1,0,-1,0]
def bfs():

    while queue:
        y,x,v,t = queue.popleft()
        if t > s-1:
            return
        for i in range(4):
            ny = y + dy[i]
            nx = x + dx[i]
            if ny < 0 or ny > n-1 or nx < 0 or nx > n-1 or board[ny][nx][0]:
                continue
            board[ny][nx] = [v,t+1]
            queue.append((ny,nx,v,t+1))

bfs()
print(board[y][x][0])

 


시간복잡도

  • 초기 바이러스를 찾기 위해 완전 탐색을 진행한다. 따라서 $N^2$의 시간이 소요된다.
  • BFS를 진행할 때 최악의 경우 모든 위치를 탐색하는 경우이기 때문에 $N^2$의 시간이 소요된다.
  • 따라서 총$ 2*N^2$이지만 상수를 제외하고  $O(N^2),$ 최악의 경우 $N = 200$이므로 약 $O(10^4)$의 시간복잡도를 가진다.
반응형

'알고리즘' 카테고리의 다른 글

[파이썬/python] 백준 - 3018 캠프파이어  (2) 2025.07.09
[파이썬/python] 백준 - 32979 아파트  (1) 2025.07.08
[파이썬/python] 백준 - 21775 가희와 자원 놀이  (0) 2025.07.06
[파이썬/python] 백준 - 3197 백조의 호수  (0) 2025.07.05
[파이썬/python] 백준 - 가지고 노는 1  (0) 2025.07.04
'알고리즘' 카테고리의 다른 글
  • [파이썬/python] 백준 - 3018 캠프파이어
  • [파이썬/python] 백준 - 32979 아파트
  • [파이썬/python] 백준 - 21775 가희와 자원 놀이
  • [파이썬/python] 백준 - 3197 백조의 호수
개골개굴
개골개굴
굶고 코딩하기
  • 개골개굴
    밥스토리
    개골개굴
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 분류 전체보기 (144)
      • 알고리즘 (124)
      • Java (2)
      • 자기개발 (18)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    python
    OS
    파이썬
    알고리즘
    작심삼일 챌린지
    컴퓨터구조
    java
    SMTP
    컴퓨터 구조
    인프런
    springboot
    async
    Redis
    백준
    completablefuture
  • 최근 댓글

  • 반응형
  • hELLO· Designed By정상우.v4.10.0
개골개굴
[파이썬/python] 백준 - 18405 경쟁적 전염
상단으로

티스토리툴바