[DFS] 음료수 얼려 먹기

merong·2023년 2월 17일
0

이코테

목록 보기
10/17
post-thumbnail

<이것이 취업을 위한 코딩테스트다>를 공부하며 정리한 내용입니다.

문제

❓ N X M 크기의 얼음 틀이 있다. 구멍이 뚫려 있는 부분은 0, 칸막이가 존재하는 부분은 1로 표시된다. 구멍이 뚫려 있는 부분끼리 상, 하, 좌, 우로 붙어 있는 경우 서로 연결되어 있는 것으로 간주한다. 이때 얼음 틀의 모양이 주어졌을 때 생성되는 총 아이스크림의 개수를 구하는 프로그램을 작성하시오.

입력 조건

  • 첫 번째 얼음 틀의 세로 길이 N과 가로 길이 M이 주어진다. (1≤N,M≤10,000)
  • 두 번째 줄부터 N+1번째 줄까지 얼음 틀의 형태가 주어진다.
  • 이때 구멍이 뚫려있는 부분은 0, 그렇지 않은 부분은 1이다.

출력 조건

  • 한 번에 만들 수 있는 아이스크림의 개수를 출력한다.

입력 예시

4 5

00110

00011

11111

00000

출력 예시

3


해설

  • DFS를 활용한다. → 재귀함수 쓰기
  • 재귀함수들을 사용해서 연결된 모든 노드들을 싹다 1로 바꿔줌.. 물밑작업..
  • 🍀그러면 딱 시작 노드들만 카운트되는 방식.
n, m = map(int, input().split())

graph=[]
for i in range(n):
    #input()하면 문자열 공백없어도 알아서 나뉜다. split() 필요없다.
    graph.append(list(map(int, input())))

def dfs(x,y):
    if x<0 or x>=n or y<0 or y>=m: #범위를 넘어가면 바로 빠이빠이
        return False

    if graph[x][y]==0: #한번도 방문하지 않은 곳이라면
        graph[x][y]=1 #방문 표시
        #상하좌우로 살펴서 연결되어 있다면 다 1로 표시해주기
        #아래 재귀함수들의 리턴값은 다 날라가서 의미 없음.
        dfs(x-1,y)
        dfs(x+1,y)
        dfs(x,y-1)
        dfs(x,y+1)
        return True

    return False

cnt=0
for i in range(n):
    for j in range(m):
        if dfs(i,j)==True: #처음 방문한 곳이라면
            cnt+=1 #카운트해주기

print(cnt)
profile
매일매일이 새로운 시작점

0개의 댓글