본문 바로가기
백준

유기농 배추 - 1012번

by 청원뿔세포 2022. 10. 4.

BFS로 해결하였다.

 

x, y로 나타낼 수 있는 문제의 어려웠던 점은 2중 배열로 표현을 하거나, 인덱스로 접근할 때, y와 x의 위치를 바꿔서 사용해줘야 한다는 점이다. 

가로 5칸, 세로 3칸을 x = 5, y = 3이라 할 수 있다.

이것을 우리가 익숙한 좌표평면행태로 보고 싶다면 arr[5][3] 이 아니라 arr[3][5]모양으로 만들어줘야한다. (파이썬에서는 이런방식으로 array를 표현하지 않지만 편의상 이렇게 적었다.)

arr[3][5]를 파이썬 식으로 표현하면 arr [ [ 0 ] * 5 for _ in range(3) ] 이고,

arr = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 로 보인다.

만약 이 배열에서 x = 2, y = 1 에 접근하고 싶다면

arr[2][1] 이 아니라 arr[1][2]로 접근해줘야 한다.

arr[2][1] = 1 을 하여 출력해보면 [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 1, 0, 0, 0]] 로 x = 1, y = 2 위치의 값이 변경된 것을 확인할 수 있다.

 

 

import sys
from collections import deque

direction = [[1,0],[-1,0],[0,1],[0,-1]]


t = int(input())

def bfs(x,y):
    visited[y][x] = True
    queue = deque([(x,y)])

    while queue:
        x, y = queue.popleft()

        for i in range(4):
            xx = direction[i][0] + x
            yy = direction[i][1] + y

            if 0 <= xx < m and 0 <= yy < n and field[yy][xx] == 1 and not visited[yy][xx]:
                queue.append((xx,yy))
                visited[yy][xx] = True


for _ in range(t):
    m, n, k = map(int, sys.stdin.readline().split())
    visited = [[False]*51 for _ in range(51)]
    field = [[False]*51 for _ in range(51)]

    

    for _ in range(k):
        x, y = map(int,sys.stdin.readline().split())
        field[y][x] = 1
    ans = 0
    for i in range(n):
        for j in range(m):
            if field[i][j] == 1 and visited[i][j] == False:
                ans+=1
                bfs(j,i)
    print(ans)

'백준' 카테고리의 다른 글

적록색약 - 10026번  (0) 2022.10.04
미로탐색 - 2178 번  (0) 2022.10.04
N과 M (2) - 15650 번  (0) 2022.10.03
N과 M (1) - 15649 번  (0) 2022.10.02
ACM 호텔 - 10250 번  (0) 2022.10.01

댓글