Notice
Recent Posts
Recent Comments
Link
반응형
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 강화학습
- HTTP
- 지도학습
- 해시
- 딕셔너리
- bineary search
- 딥러닝
- 코테
- 깊이우선탐색
- 프로그래머스
- 머신러닝
- 파이썬
- 파이썬 오류
- 코딩테스트
- BOJ
- 스택과 힙
- 캐싱
- post
- 백준
- 알고리즘
- Merge sort
- 오버라이딩
- 너비우선탐색
- 이진탐색
- 파이썬 알고리즘
- 비지도학습
- 코딩
- rest api
- 자바
- 멱등
Archives
- Today
- Total
chae._.chae
[Algorithm] 백준 #14502 - 연구소 본문
728x90
반응형
https://www.acmicpc.net/problem/14502
14502번: 연구소
인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크
www.acmicpc.net
📌 풀이 방법
완전탐색(Brute Force) + bfs 의 방법으로 풀어야하는 문제이다.
브루트 포스로 벽3개의 위치로 가능한 경우의 수를 모두 구해주고, 그때마다 bfs함수를 돌려주며 안전영역(0) 갯수의 최댓값을 구한다.
- virus() 함수 : 바이러스를 퍼트리는 함수로, 값이 2인 지점을 만나면 큐에 넣고, 상하좌우를 살피며 0인 지역이 있으면 바이러스가 퍼진 2의 상태로 모두 바꿔준다. (result변수로 바이러스가 총 몇개의 구역에 퍼졌는지 카운트해준다)
- walls() 함수 : 세워야하는 벽의 갯수가 3개였으므로, 이중 for문을 돌면서 벽을 세우는 경우의 수를 모두 확인해주는 함수이다.
import sys
from collections import deque
n, m= map(int, sys.stdin.readline().rstrip().split())
graph=[]
max_result=0
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
for _ in range(n):
graph.append(list(map(int, sys.stdin.readline().rstrip().split())))
cnt = 0
for i in range(n):
for j in range(m):
if graph[i][j] == 0:
cnt += 1 # 처음0의개수
# 바이러스 퍼지는 함수
def virus():
visited = [[0]*m for _ in range(n)]
result = 0
global max_result
q = deque()
for i in range(n):
for j in range(m):
if graph[i][j] == 2: # 바이러스이면
visited[i][j] = 1 # 방문처리 해주고 큐에 넣어주기
q.append((i, j))
while q:
x, y = q.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0<= nx < n and 0 <= ny < m and visited[nx][ny] == 0:
if graph[nx][ny] == 0:
visited[nx][ny] = 1
result += 1 # 하나 증가
q.append((nx, ny)) # 큐에 넣어주기]
max_result = max(max_result, cnt-result)
def walls(cnt):
if cnt == 3:
virus()
return
for i in range(n):
for j in range(m):
if graph[i][j] == 0:
graph[i][j] = 1 # 벽세우기기
walls(cnt+1)
graph[i][j] = 0
walls(0)
print(max_result-3)
Python으로 돌리면 시간초과가 발생하여 PyPy3로 제출하였다.
두 개의 차이점이 무엇인지 찾아보니, Python3의 실행시 시간이 매우 오래 걸린다는 단점이 있어 이것을 개선하고자 도입한 것이 PyPy3라고 한다. 그렇다고 해서 항상 PyPy3를 사용하는 것이 효율적이지는 않다. 특정 경우에는 Python이 더 유리한 경우도 있어 적절하게 섞어 사용할 줄 알아야 한다!
728x90
'파이썬 알고리즘 > BOJ' 카테고리의 다른 글
[Algorithm] 백준 #1874 - 스택 수열 (0) | 2023.06.18 |
---|---|
백준 구현 문제 틀린거 모음 : 구현(1) (0) | 2022.06.28 |
[Algorithm] 백준 #1012 - 유기농 배추 (0) | 2022.05.27 |
[Algorithm] 백준 #2667 - 단지번호붙이기 (0) | 2022.05.27 |
[Algorithm] 백준 #4963 - 섬의 개수 (0) | 2022.05.20 |