문제링크 : https://www.acmicpc.net/problem/1012
- 상하좌우 좌표를 이용하는 문제니 저번에 풀었던 섬의 개수 문제를 응용하여 풀자
-> BFS를 이용하려 했으나 실패.. ㅠ (실패 원인을 아직 파악하지 못함)
import sys
input = sys.stdin.readline
test_case = int(input())
def dfs(x, y):
visited[x][y] = True
dirs = [(0, 1), (0, -1), (-1, 0), (1, 0)]
for dx, dy in dirs:
nx, ny = x + dx, y + dy
if nx<0 or nx>=n or ny <0 or ny>=m:
continue
if plot[nx][ny] and not visited[nx][ny]:
dfs(nx, ny)
for _ in range(test_case):
m, n, k = map(int, input().split())
plot = [[0]*m for _ in range(n)]
visited = [[False]*m for _ in range(n)]
for _ in range(k):
# velog
y, x = map(int, input().split())
plot[x][y] = 1
cnt = 0
for i in range(n):
for j in range(m):
if plot[i][j] and not visited[i][j]:
dfs(i, j)
cnt += 1
print(cnt)
def dfs(x, y):
visited[x][y] = True
dirs = [(0, 1), (0, -1), (-1, 0), (1, 0)]
for dx, dy in dirs:
nx, ny = x + dx, y + dy
if nx<0 or nx>=n or ny <0 or ny>=m:
continue
if plot[nx][ny] and not visited[nx][ny]:
dfs(nx, ny)
m, n, k = map(int, input().split())
plot = [[0]*m for _ in range(n)]
visited = [[False]*m for _ in range(n)]
for _ in range(k):
# velog: 우선은 외우자..
y, x = map(int, input().split())
plot[x][y] = 1
안녕하세요. 저는 튜터님은 아니지만... 가로가 x이고 세로가 y인데
x,y = map(int, input().split())
plot[x][y] = 1
이라고 하면 안 되고 y,x =이라고 써야 하는 이유는...
우리 눈으로 보는 좌표에서는 가로가 x이고 세로가 y니까 x가 먼저고 y가 다음일 것으로 보이지만, 그것을 2차원 행렬에 넣었을 때에는 '가로' 좌표는 '열'이고 '세로' 좌표는 '행'이기 때문에 순서가 반대인 것으로 알고 있습니다. 예를 들어 위의 문제 스크린샷에 나와 있는 그림에서 가로를 x, 세로를 y로 쓰면 (3,4)에 배추 1이 있는 그림으로 되어 있는데요, 2차원 행렬에서의 좌표는 4째줄 3번째칸(4행 3열)의 값을 1로 만들어야 하기 때문에 3 4를 입력받고 plot[4][3]=1을 저장해줘야 하죠. x좌표는 열이고 y좌표는 행이니까 '행렬'을 나타내는 2차원 배열에서는 y와 x의 순서가 바뀌면 됩니다.