Skip to content

Commit 95b6426

Browse files
committed
[BOJ] 버섯 농장 / 실버 1 / 80분
https://www.acmicpc.net/problem/27737
1 parent b875736 commit 95b6426

File tree

1 file changed

+90
-0
lines changed

1 file changed

+90
-0
lines changed
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
'''
2+
3+
4+
농부 해강이는 N X N칸으로 이루어진 나무판에서 버섯 농사를 짓는다. 나무판은 버섯이 자랄 수 있는 칸과 없는 칸으로 이루어져 있다.
5+
6+
7+
각 버섯 포자는 포자가 심어진 칸을 포함해 최대 K개의 연결된 (버섯이 자랄 수 있는) 칸에 버섯을 자라게 한다.
8+
이때 연결된 칸은 상하좌우로 적어도 한 변을 공유하는 칸들의 집합이라고 정의한다.
9+
10+
또한 한 칸에 버섯 포자를 여러 개 겹쳐서 심을 수 있으며, 만약 x개의 버섯 포자를 겹쳐 심으면 포자가 심어진 칸을 포함해 최대
11+
x X K개의 연결된 (버섯이 자랄 수 있는) 칸에 버섯이 자란다.
12+
13+
14+
해강이는 버섯 포자를 심을 때 최소 개수로만 심으려고 한다.
15+
해강이가 농사가 가능할지 판단하고, 농사가 가능하다면 남은 버섯 포자의 개수를 출력하시오.
16+
버섯 포자를 하나라도 사용하고 버섯이 자랄 수 있는 모든 칸에 버섯이 전부 자랐을 때 농사가 가능하다고 정의한다.
17+
18+
1. N X N 칸에서 버섯을 심어야 함. 이때 심은 버섯은 상하좌우 최대 K칸으로 확산.
19+
(버섯을 심은 칸을 시작으로 BFS 탐색 진행하면 해당 칸으로부터 버섯을 심을 수 있는 인접한 칸이 몇개인지 알수 있음)
20+
21+
2. 2차원 배열을 순회하며 칸이 0이고 아직 방문하지 않았다면 거기서부터 BFS 탐색 시작.
22+
3. BFS 탐색으로 해당 칸으로부터 상하좌우 인접한 0(버섯 농사 가능 칸)이 몇 개인지 파악후 K개로 나누면 해당 구역에 몇개의 버섯 포자가 필요한지 계산 가능
23+
4. 2-3을 반복하며 모든 버섯 농사 가능 구역을 세며 총 몇개의 버섯 포자가 필요한지 계산
24+
5. 필요한 버섯 포자 개수가 M보다 크면 남은 버섯 개수를 출력 그렇지 않다면 IMPOSSIBLE 출력.
25+
5-1. 이떄 버섯 포자를 하나도 사용하지 않아도 IMPOSSIBLE 출력
26+
27+
'''
28+
29+
from collections import deque
30+
31+
32+
def bfs(i, j, visited):
33+
dx = [-1, 1, 0, 0]
34+
dy = [0, 0, -1, 1]
35+
36+
queue = deque()
37+
38+
# 시작점 방문처리
39+
queue.append((i, j))
40+
visited[i][j] = 1
41+
42+
# 시작점(x,y)으로부터 인접한 버섯 농사 가능 칸의 개수 (시작점 포함)
43+
num = 1
44+
45+
while queue:
46+
x, y = queue.popleft()
47+
48+
# 상하좌우 인접한 칸에 버섯 농사 가능한지 보기
49+
for k in range(4):
50+
nx = x + dx[k]
51+
ny = y + dy[k]
52+
53+
# 그래프 범위에 있는지, 버섯 농사가 가능한지, 아직 방문하지 않았는지 확인
54+
if (0 <= nx <= N - 1 and 0 <= ny <= N - 1) and graph[nx][ny] == 0 and visited[nx][ny] == 0:
55+
# 방문처리
56+
queue.append((nx, ny))
57+
visited[nx][ny] = 1
58+
# 버섯 농사 가능한 칸의 개수 증가
59+
num += 1
60+
61+
# 해당 구역에 필요한 버섯 포자 개수 반환
62+
if num % K == 0:
63+
return num // K
64+
else:
65+
return (num // K) + 1
66+
67+
68+
# 입력받기
69+
N, M, K = map(int, input().split())
70+
71+
# 나무판 배열
72+
graph = []
73+
# 나무판 방문 배열
74+
visited = [[0] * N for _ in range(N)]
75+
76+
mushroom_count = 0
77+
78+
for _ in range(N):
79+
graph.append(list(map(int, input().split())))
80+
81+
for i in range(N):
82+
for j in range(N):
83+
# 나무판이 버섯을 심을 수 있고, 아직 방문하지 않았으면
84+
if graph[i][j] == 0 and visited[i][j] == 0:
85+
mushroom_count += bfs(i, j, visited)
86+
87+
if mushroom_count == 0 or mushroom_count > M:
88+
print("IMPOSSIBLE")
89+
else:
90+
print(f"POSSIBLE\n{M - mushroom_count}")

0 commit comments

Comments
 (0)