

풀이 요소
- 인접한 노드 모두 방문해야 한다 -> dfs 활용
- 입력을 graph화 시키기 & 방문 체크 표현 방법
- dfs 진행한 덩어리를 count로 출력
- 다 돌기 위해 이중 For문 활용
- graph에서 상하좌우 이동 어떻게 할 건지 & 벗어나는 경우 생각
풀이
- 입력 graph로 표현하기
m,n = map(int,input().split()) #가로:m, 세로:n
graph=[] #빈 그래프 하나 만들어주고
for _ in range(n):
graph.append(list(map(int,input())))
맨 처음에 생각한 건 map으로 안하고 input()으로만 썼다. 하지만 이렇게 하니 우리가 원하는 행렬 방식의 리스트를 만들 수 없었고, 그냥 str 형태로 나타나게 되었다.
list(map(int,input())) 의 효과 : input되는 요소 하나하나씩 int로 처리해준다. 그래서 우리가 원하는 행렬을 만들 수 있다.
- dfs 함수 + 상하좌우 이동 처리 방법 + 방문 처리
def dfs(x,y):
if x<=-1 or x>=n or y<=-1 or y<=m: #범위를 벗어나면
return False #false를 리턴한다
if graph[x][y] == 0: #범위 안벗어나고 요소가 0이면
graph[x][y] = 1 #1로 바꿔준다
#이게 방문처리 한 거임. 바로 이렇게 1로 바꿔주면서 나중에 1인 거는 pass함
dfs(x-1,y) #상하좌우에 관해 재귀적으로 파고 들어가서 다시 함수 실시해준다.
dfs(x+1,y)
dfs(x,y-1)
dfs(x,y+1)
#상하좌우로 연결되어있는 곳을 모두 방문하고 나면 true값이 1번 출력된다
#왜냐면 재귀적으로 들어가서 각각 막히면 안에서 false값을 띄우면서 빠져나오게 되고
#재귀를 다 빠져나오고 가장 바깥에 있는 것은 dfs를 실시했기 때문에 true값을 1번 출력함
return True
return False
#이도 저도 아닌 (=1인 경우) 경우에는 false값을 출력
- 이중 for문 + count 출력
count = 0
for i in range(n):
for j in range(m):
if dfs(j,i) == true:
count += 1
- 전체 코드
#connected component 찾기
n,m = map(int,input().split()) #가로 m 세로 n
graph=[]
for _ in range(n):
graph.append(list(map(int,input())))
count=0
def dfs(x,y):
if x<=-1 or x>=n or y<=-1 or y>=m:
return False
if graph[x][y] == 0:
graph[x][y] = 1
dfs(x-1,y)
dfs(x+1,y)
dfs(x,y-1)
dfs(x,y+1)
return True
return False
for i in range(n):
for j in range(m):
if dfs(j,i) == True:
count+=1
print(count)
'PS' 카테고리의 다른 글
| [ 프로그래머스 - 타켓 넘버 ] DFS (0) | 2021.08.06 |
|---|---|
| [ 백준 2178 - 미로탐색 ] - bf (0) | 2021.08.06 |
| 7주차 [백준 2606 - 바이러스] (0) | 2021.08.05 |
| DFS와 BFS (0) | 2021.08.04 |
| 6주차 [ 프로그래머스 - 카카오 다트게임 ] (0) | 2021.07.30 |