티스토리 뷰
POINT
dfs (깊이 우선 탐색)
바이러스가 있는 곳(2)을 기준으로, 주변에 바이러스를 퍼뜨린다.
→ 바이러스 주변 칸의 값이 0이면 2로 바꾸고 주변을 계속 탐색한다. (방문 처리)
풀이
1. 새로운 벽을 3개 세운다.
2. 바이러스를 퍼뜨린다.
3. 안전 지역의 최댓값을 계산한다.
4. 모든 곳에 벽을 세워 볼 때까지 1 ~ 3을 반복한다.
from itertools import combinations
n, m = map(int, input().split())
graph = [[0] * m for _ in range(n)]
new_graph =[[0] * m for _ in range(n)] # 복사한 그래프
blanks = [] # 빈칸 위치를 넣은 리스트
for r in range(n):
data = list(map(int, input().split()))
for c in range(m):
graph[r][c] = data[c] # 그래프 정보 저장
if data[c] == 0:
blanks.append((r,c)) # 빈칸 좌표 저장
new_walls = combinations(blanks, 3) # 3개의 벽을 세우는 경우의 수
# 벽을 3개 세운다.
def add_new_walls(graph, walls):
for r, c in walls:
graph[r][c] = 1
# 빈칸인 곳에 바이러스를 퍼뜨린다.
def dfs(graph, x, y):
# 그래프 범위를 벗어나면 종료
if x < 0 or x >= n or y < 0 or y >= m:
return
# 빈 칸이면 바이러스 퍼뜨리기
if graph[x][y] == 0:
graph[x][y] = 2 # 방문 처리
dfs(graph, x-1, y)
dfs(graph, x+1, y)
dfs(graph, x, y-1)
dfs(graph, x, y+1)
# 안전 지역의 크기를 반환한다.
def get_size(graph):
result = 0
for r in range(n):
for c in range(m):
if graph[r][c] == 0:
result += 1
return result
answer = 0
for case in new_walls:
# 그래프 복사
for r in range(n):
for c in range(m):
new_graph[r][c] = graph[r][c]
add_new_walls(new_graph, case) # 벽 세우기
for x in range(n):
for y in range(m):
# 바이러스가 있으면 주변으로 퍼뜨리기
if new_graph[x][y] == 2:
dfs(new_graph, x-1, y)
dfs(new_graph, x+1, y)
dfs(new_graph, x, y-1)
dfs(new_graph, x, y+1)
area = get_size(new_graph) # 안전 지역 크기 구하기
answer = max(answer, area) # 최댓값 갱신
print(answer)
'🧩 알고리즘' 카테고리의 다른 글
[백준] 듣보잡 - Python (0) | 2022.11.14 |
---|---|
[백준] 하노이 탑 이동 순서 - Python (0) | 2022.11.14 |
[프로그래머스] 기둥과 보 설치 - Python (0) | 2022.07.27 |
[프로그래머스] 무지의 먹방 라이브 - Python (0) | 2022.07.25 |
[프로그래머스 Lv.2] 빛의 경로 사이클 - Python (0) | 2022.07.01 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 다이나믹프로그래밍
- 동기
- dfs
- DP
- javascript
- 코테
- p5js
- Python3
- 원티드
- node.js
- 코드분석
- fetch
- 문제풀이
- 비동기
- rn
- 세션
- flutter
- python
- React
- backtracking
- 파이썬
- Spotify
- React.js
- 이벤트루프
- 프로그래머스
- 코어자바스크립트
- React-native
- 백준
- Unsplash
- 코딩테스트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함