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 |
Tags
- pcce 기출문제 풀이
- 브루트포스
- c++
- PCCE
- two characters
- boj 6443
- making anagrams
- pccp 기출문제 풀이
- DirectX12
- 지게차와 크레인
- find the town judge
- lock based stack
- find the running median
- the maximum subarray
- LCS
- ice cream parlor
- lock based queue
- 2025 프로그래머스 코딩챌린지 1차예선
- boj 11657
- string construction
- the longest increasing subsequence
- dp
- DirectX
- 프로그래밍공부
- boj 1074
- boj 1717
- gas
- count triplets
- lock free stack
- special string again
Archives
- Today
- Total
오구의코딩모험
[Python] 14502번 : 연구소 본문
반응형
문제 3줄 요약
1. 0은 빈칸, 1은 벽, 2는 바이러스
2. 벽이 세워지지 않는 빈칸에는 바이러스가 퍼진다.
3. 3개의 벽을 세워 바이러스 퍼지는 것을 최소화해라!
3개의 벽을 세울 수 있는 모든 경우의 수를
브루트포스 알고리즘을 이용하고
벽을 임의로 세우고 난 후, 바이러스를 BFS로 확산시켜
남아 있는 빈칸의 수를 최대가 나올 때까지 갱신시킨다.
from sys import stdin
# 좌표 넣을 구조체
class XY:
def __init__(self, x, y):
self.x = x
self.y = y
# 바이러스 확산
def BFS(copy_list, two):
Q = []
for check in two:
Q.append(check)
## 상하좌우로 확산
while(len(Q) != 0):
## RIGHT
if (Q[0].y < M-1):
if copy_list[Q[0].x][Q[0].y+1] == 0:
copy_list[Q[0].x][Q[0].y+1] = 2
Q.append(XY(Q[0].x,Q[0].y+1))
## DOWN
if (Q[0].x < N-1):
if copy_list[Q[0].x+1][Q[0].y] == 0:
copy_list[Q[0].x+1][Q[0].y] = 2
Q.append(XY(Q[0].x+1,Q[0].y))
## LEFT
if (Q[0].y > 0):
if copy_list[Q[0].x][Q[0].y-1] == 0:
copy_list[Q[0].x][Q[0].y-1] = 2
Q.append(XY(Q[0].x,Q[0].y-1))
## UP
if (Q[0].x > 0):
if copy_list[Q[0].x-1][Q[0].y] == 0:
copy_list[Q[0].x-1][Q[0].y] = 2
Q.append(XY(Q[0].x-1,Q[0].y))
del Q[0]
result = 0
for c_item in copy_list:
result += c_item.count(0)
return result
if __name__ == "__main__":
## 지도의 세로 크기 N, 가로 크기 M
N, M = map(int, stdin.readline().split())
map_list = []
two_list = []
answer = 0
for x in range(N):
## N개의 지도의 모양
numbers = list(map(int, stdin.readline().split()))
line = []
for y, num in enumerate(numbers):
if num == 2:
two_list.append(XY(x,y))
line.append(num)
map_list.append(line)
## 첫 번째 벽 경우의 수
for first in range(N*M):
if map_list[first//M][first%M] == 0:
map_list[first//M][first%M] = 1
## 두 번째 벽 경우의 수
for sec in range(first+1, N*M):
if map_list[sec//M][sec%M] == 0:
map_list[sec//M][sec%M] = 1
## 세 번째 벽 경우의수
for trd in range(sec+1, N*M):
if map_list[trd//M][trd%M] == 0:
map_list[trd//M][trd%M] = 1
copy_list = [maps.copy() for maps in map_list]
cnt = BFS(copy_list, two_list)
answer = answer if answer > cnt else cnt
map_list[trd//M][trd%M] = 0
map_list[sec//M][sec%M] = 0
map_list[first//M][first%M] = 0
## 최대 빈칸의 수
print(answer)
BFS가 익숙하지 않아 코드를 작성하는데 시간이 오래걸렸다.
좀 더 많은 BFS, DFS 알고리즘 문제를 풀어보고
구현 시간을 줄여보도록 노력해야겠다.
끝!
반응형
'프로그래밍 공부 > 백준 알고리즘' 카테고리의 다른 글
[Python] 15686번 : 치킨 배달 (0) | 2023.02.16 |
---|---|
[Python] 14503번 : 로봇 청소기 (0) | 2023.02.16 |
[Python] 1351번 : 무한 수열 (0) | 2023.02.14 |
[Python] 1043번 : 거짓말 (0) | 2023.02.14 |
[Python] 1021번 : 회전하는 큐 (0) | 2023.02.14 |
Comments