[이코테] 5-3 음료수 얼려 먹기(DFS)

Programming/이것이 취업을 위한 코딩 테스트다 문제풀이

[이코테] 5-3 음료수 얼려 먹기(DFS)

tnddj1219 2022. 3. 15. 13:40
728x90

정리내용은 [이것이 취업을 위한 코딩 테스트다 with 파이썬] 책을 기반으로 작성하였습니다.

 

이것이 취업을 위한 코딩 테스트다 with 파이썬 - 교보문고

취업과 이직을 결정하는 알고리즘 인터뷰 완벽 가이드 | 이런 독자에게 권합니다.■ IT 직군의 취업 준비생 / 예비 개발자■ 이직을 준비하는 개발자■ 알고리즘 대회를 준비하는 학생[특징]코딩

www.kyobobook.co.kr


난이도 중하 | 풀이시간 30분 | 시간제한 1초 | 메모리제한 128MB

 

문제

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

 

예시

입력조건

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

 

출력조건

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

 

코드 구현

## 음료수 얼려 먹기
import sys
N,M =map(int, sys.stdin.readline().split())
graph= [ list(map(int, sys.stdin.readline().strip())) for _ in range(N)]

ice_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]=True
        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(i, j) == True: # 현재 위치에서 DFS 수행
            ice_count += 1
print(ice_count)

이것은 아래와 같이 구현한다.

1. 특정한 지점의 주변 상, 하, 좌, 우를 살펴본 뒤에 주변 지점 중에서 값이 0이면서 아직 방문하지 않은 지점이 있으면 해당 지점을 방문핟나.

2. 방문한 지점에서 다시 상, 하, 좌, 우를 살펴보면서 방문을 다시 진행하면 연결된 모든 지점을 방문할 수 있다.

3. 1,2번의 모든 노드를 반복하면서 방문하지 않은 지점의 수를 센다.

728x90