CS/알고리즘_문제풀이(파이썬)

Level 3. 전염병

Jedy_Kim 2021. 8. 3. 17:20
728x90

문제설명

m x n 크기인 사무실이 있습니다. 사무실에는 전염병에 걸린 직원이 있는데, 이 직원은 매일 상하좌우로 병을 퍼트려 다른 직원을 감염시킵니다. 단, 백신을 접종한 직원은 면역력이 있어 감염되지 않습니다.

예를 들어 2x4 크기 사무실에서, 병에 걸린 직원의 위치가 (1,4), (2,2)이고 백신을 맞은 직원의 위치가 (1,2)입니다. 이때 백신을 맞은 직원을 제외한 모든 직원이 병에 감염되기 까지는 이틀이 소요됩니다.


사무실의 크기 m, n과 병에 걸린 직원의 위치 infests, 백신을 맞은 직원의 위치 vaccinateds가 매개변수로 주어집니다. 이때 백신을 맞은 직원을 제외한 모든 직원이 병에 감염되기까지 며칠이 걸리는지 return 하는 solution 함수를 완성해주세요.

 

입출력 예

m n infests vaccinateds result
2 4 [[1,4],[2,2]] [[1,2]] 2
2 3 [[2,2]] [[1,2],[2,1],[2,3]] -1
2 2 [[1, 1], [2, 2]] [[1, 2], [2, 1]] 0

 

 

#코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from collections import deque
 
def solution(m, n, infests, vaccinateds):
    answer = 0
    day = m * n
    # m행 n열 크기의 배열을 만들고 기본값으로 False를 셋팅해준다.
    arr = [[False* (n) for _ in range(m)]
 
    # 백신 접종자를 표기해준다. -2
    for yPos, xPos in vaccinateds:
        arr[yPos - 1][xPos - 1= -2 
        day -= 1
 
 
    # 상, 하, 좌, 우
    dy = [-1100]
    dx = [00-11]     
    deq = deque()  
 
 
    for row, col in infests:        
        deq.append((row - 1, col - 10)) 
        arr[row - 1][col - 1= True
        day -= 1
 
    while day > 0 and deq:        
        pop_row, pop_col, pop_day = deq.popleft()        
 
        for i in range(4):
            ny = dy[i] + pop_row
            nx = dx[i] + pop_col
 
            if 0 <= ny < m and 0 <= nx < n:
                if arr[ny][nx] != -2 and not arr[ny][nx]: 
                    arr[ny][nx] = True    
                    day -= 1
                    deq.append((ny, nx, pop_day + 1))
                    answer = pop_day + 1         
 
 
    return answer if day <= 0 else -1
cs

 

반응형

'CS > 알고리즘_문제풀이(파이썬)' 카테고리의 다른 글

파티  (0) 2021.08.04
특정 최단거리  (0) 2021.08.04
배상 비용 최소화 사본  (0) 2021.08.02
게임아이템  (0) 2021.08.02
더 맵게  (0) 2021.07.31