|
| 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