https://www.acmicpc.net/problem/18405
18405번: 경쟁적 전염
첫째 줄에 자연수 N, K가 공백을 기준으로 구분되어 주어진다. (1 ≤ N ≤ 200, 1 ≤ K ≤ 1,000) 둘째 줄부터 N개의 줄에 걸쳐서 시험관의 정보가 주어진다. 각 행은 N개의 원소로 구성되며, 해당 위치
www.acmicpc.net
이번 문제는 bfs를 적용해서 풀 수 있었다.
처음 queue를 생성하고 최초 시험관의 바이러스를 넣어줄 때 정렬하는 방법에서 상당히 큰 시간복잡도를 요구해서 아슬아슬하게 해결했는데, list를 만든 후에 이를 정렬하고 queue에 넣어주는 방법으로 시간복잡도를 상당히 줄일 수 있다는 것을 알게 되었다. 그래서 이를 적용해 시간복잡도를 줄일 수 있었다.
from collections import deque
N, K = map(int, input().split())
data = []
for i in range(N):
data.append(list(map(int, input().split())))
S, X, Y = map(int, input().split())
temp = []
for i in range(N):
for j in range(N):
if data[i][j] != 0:
temp.append([data[i][j], i, j])
temp.sort()
queue = deque(temp)
#print(queue)
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
before = 0
after = 0
info = 0
while queue:
count, x, y = queue.popleft()
after = data[x][y]
if before == K and after == 1:
info += 1
if info == S:
break
before = data[x][y]
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < N and 0 <= ny < N:
if data[nx][ny] == 0:
data[nx][ny] = count
queue.append([data[nx][ny], nx, ny])
#print(queue)
print(data[X - 1][Y - 1])
'알고리즘 > python' 카테고리의 다른 글
| 2178번 미로 탐색(python3) (0) | 2022.01.29 |
|---|---|
| 2667번 단지번호붙이기(python3) (0) | 2022.01.29 |
| 1715번 카드 정렬하기(python) (0) | 2022.01.27 |
| 1316번 그룹 단어 체커(python3) (0) | 2022.01.25 |
| 이.코.테 바닥공사, 효율적인 화폐 구성(python3) (0) | 2022.01.25 |