'삼성 SW 역량 테스트' 기출 문제 입니다. 😀
문제 👉 17142번: 연구소 3
1. 문제
- N*N 크기의 연구소는 빈 칸과 벽 그리고 M개의 활성 바이러스로 이루어져 있다.
- 바이러스는 상하좌우로 인접한 빈 칸으로 모두 퍼져나갈 수 있다.
- 어떤 바이러스를 놓았을 때, 바이러스가 퍼지는 최소 시간을 출력한다.
2. 풀이
브루트포스
와 BFS
를 이용한 문제 풀이
브루트포스
를 통해 M개의 바이러스를 선택한다.BFS
를 통해 바이러스의 전파 최대 시간을 구한다.
3. 코드
from collections import deque
N, M = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)]
selceted = [False] * 10
dx , dy = [1, -1, 0, 0], [0, 0, 1, -1]
que, virus, vacnt, ret = deque(), [], 0, float('inf')
def solution():
global virus, vacnt, ret
# 바이러스 전파
def bfs(chk):
global ret
infect, times = 0, 0
while que:
x, y = que.popleft()
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if nx < 0 or nx >= N or ny < 0 or ny >= N:
continue
if board[nx][ny] != 1 and chk[nx][ny] == -1: #벽이 아니고 처음 들렸을 때
chk[nx][ny] = chk[x][y] + 1
que.append((nx,ny))
if board[nx][ny] == 0:
infect += 1
times = chk[nx][ny]
if infect == vacnt:
ret = min(ret, times)
# 바이러스 M개 선택
def solve(idx, cnt, v):
global que
if cnt == M:
chk = [[-1] * N for _ in range(N)]
for i in range(v):
if selceted[i]:
x, y = virus[i]
que.append((x, y))
chk[x][y] = 0
bfs(chk)
return
for i in range(idx, v):
if not selceted[i]:
selceted[i] = True
solve(i+1, cnt+1, v)
selceted[i] = False
# 초기 빈칸의 개수와 바이러스 위치 저장
for i in range(N):
for j in range(N):
if board[i][j] == 2:
virus.append([i,j])
elif board[i][j] == 0:
vacnt += 1
solve(0,0,len(virus))
if ret == float('inf'):
return -1
return ret
print(solution())
- 결과 : 896 ms
- 연구소 1,2 문제를 풀고 다시 풀어보니 정리가 된 느낌이다... 다들 한번 풀어보면 좋을거 같다.
References
🏋🏻 개인적으로 공부한 내용을 기록하고 있습니다.
잘못된 부분이 있다면 과감하게 지적해주세요!! 🏋
'Coding Test > BOJ' 카테고리의 다른 글
[백준] 17143 - 낚시왕 [Python(파이썬)] (0) | 2021.11.22 |
---|---|
[백준] 17141 - 연구소 2 [Python(파이썬)] (0) | 2021.11.22 |
[백준] 17140 - 이차원 배열과 연산 [Python(파이썬)] (0) | 2021.11.22 |
댓글