import collections dx=[1,-1,0,0] dy=[0,0,1,-1] def bfs(n): que=collections.deque() que.append(n) while que: t=que.popleft() ax=t//1000000 ay=t%1000000 visit[ax][ay]=0 for i in range(4): nx=ax+dx[i] ny=ay+dy[i] if 0<=nx<M and 0<=ny<N: if arr[nx][ny]==1 and visit[nx][ny]==-1: que.append(1000000*nx+ny) visit[nx][ny]=0 return T=int(input()) for tc in range(1,T+1): N,M,K=list(map(int,input().split())) arr=[[0 for j in range(N)] for i in range(M)] visit=[[-1]*N for i in range(M)] for _ in range(K): y,x=list(map(int,input().split())) arr[x][y]=1 cnt=0 for i in range(M): for j in range(N): if arr[i][j]==1 and visit[i][j]==-1: cnt+=1 bfs(i*1000000+j) print(cnt)
위의 방식은 BFS를 이용해서 푼 방식이다.
dx=[1,-1,0,0] dy=[0,0,1,-1] import sys sys.setrecursionlimit(10**6) def dfs(x,y,_cnt): dist[x][y]=_cnt for k in range(4): nx=x+dx[k] ny=y+dy[k] if 0<=nx<N and 0<=ny<M: if arr[nx][ny] and dist[nx][ny]==-1: dfs(nx,ny,_cnt) t=int(input()) for _ in range(t): M,N,K=map(int,input().split()) arr=[[0 for col in range(M)] for row in range(N)] dist=[[-1 for col in range(M)] for row in range(N)] for _ in range(K): y,x=map(int,input().split()) arr[x][y]=1 cnt=0 for i in range(N): for j in range(M): if arr[i][j]==1 and dist[i][j]==-1: cnt+=1 dfs(i,j,cnt) print(cnt)
DFS를 이용한 방식이다.
BFS나 DFS로 풀면 되는 문제이다. 방문한적이 없고 서로 연결된 것들의 개수를 구하면 되는 문제이다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ] 1149 RGB 거리 (0) | 2021.01.14 |
---|---|
[BOJ] 12865 평범한 배낭 (0) | 2021.01.14 |
[BOJ] 1010 다리 놓기 (0) | 2021.01.13 |
[BOJ] 1002 터렛 (0) | 2021.01.13 |
[BOJ] 5014 스타트링크 (0) | 2021.01.13 |