- 문제 : https://www.acmicpc.net/problem/1743
문제 이해
- bfs를 이용해서 1이 모여있는 각 영역의 크기 중에서 가장 큰 값을 출력하는 문제다.
- 음식물의 주어진 위치 n, m 값이 1부터 시작하기 때문에 n -= 1, m -= 1을 하지 않으면 IndexError가 발생한다.
풀이 로직
- 행렬 세로, 가로, 음식물의 개수를 입력받는다.
- matrix에 음식물의 위치를 행 - 1, 열 - 1 위치에 1로 입력한다.
- matrix를 완전 탐색하면서 방문하지 않고, 음식물인 (matrix[i][j] == 1) 위치를 중심으로 bfs를 진행한다.
- 각 bfs를 실행할 때마다 영역의 크기를 count로 센 다음 마지막에 count를 반환하면 된다.
- 각 count 값 중에서 최댓값을 찾아서 출력하면 정답
정답 풀이
n, m, k = map(int, input().split())
matrix = [[0] * m for _ in range(n)]
visit = [[0] * m for _ in range(n)]
dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
for _ in range(k):
a, b = map(int, input().split())
matrix[a - 1][b - 1] = 1
def bfs(x, y, matrix, visit):
queue = [[x, y]]
visit[x][y] = 1
count = 1
while queue:
x, y = queue.pop(0)
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0 <= nx < n and 0 <= ny < m:
if not visit[nx][ny] and matrix[nx][ny] == 1:
visit[nx][ny] = 1
count += 1
queue.append([nx, ny])
return count
answer = 0
for i in range(n):
for j in range(m):
if not visit[i][j] and matrix[i][j] == 1:
answer = max(answer, bfs(i, j, matrix, visit))
print(answer)
'백준 > Search' 카테고리의 다른 글
[bfs/백준] 6593번 : 상범 빌딩 (0) | 2023.05.16 |
---|---|
[bfs/백준] 5014번 : 스타트링크 (0) | 2023.05.16 |
[bfs/백준] 13913번 : 숨바꼭질 4 (0) | 2023.05.15 |
[bfs/백준] 13549번 : 숨바꼭질3 (0) | 2023.05.15 |
[bfs/백준] 12851번 : 숨바꼭질2 (0) | 2023.05.12 |