초보 개발자의 일기

5-3 음료수 얼려먹기 본문

코딩테스트/이것이 코딩테스트다.(Python)

5-3 음료수 얼려먹기

판다꼬마 2022. 6. 4. 18:48
728x90

문제

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

 

 

 

 

입력

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

 

출력

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

 

입력 예시

4 5
00110
00011
11111
00000

출력 예시

3

풀이 방법

dfs를 사용하여 풀었다.

우선 array[x][y]가 0인 곳을 찾았다.

0인 곳을 찾으면 방문 표시를 한 뒤 상하좌우 모든 재귀 호출을 통해서

0인 곳을 찾아 방문표시를 한다.

0을 인곳을 찾아 방문 표시를 하면 True를 반환하고 True일 때는 result의 값을 1씩 증가시켜준다.

0인 곳을 다 찾으면 False가 리턴되며 result의 값이 변하지 않는다.

 

내 코드

n,m=map(int,input().split())

array=[]
for i in range(n):
    array.append(list(map(int,input())))
    
result=0

def dfs(x,y):
    if x<=-1 or x>=n or y<=-1 or y>=m:
        return False
    
    if array[x][y]==0:
        array[x][y]=1
        
        dfs(x-1,y)
        dfs(x+1,y)
        dfs(x,y-1)
        dfs(x-1,y+1)
        return True
    return False

for i in range(n):
    for j in range(m):
        if dfs(i,j)==True:
            result+=1

print(result)

Solution


# N, M을 공백을 기준으로 구분하여 입력 받기
n, m = map(int, input().split())

# 2차원 리스트의 맵 정보 입력 받기
graph = []
for i in range(n):
    graph.append(list(map(int, input())))

# DFS로 특정한 노드를 방문한 뒤에 연결된 모든 노드들도 방문
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, y - 1)
        dfs(x + 1, y)
        dfs(x, y + 1)
        return True
    return False

# 모든 노드(위치)에 대하여 음료수 채우기
result = 0
for i in range(n):
    for j in range(m):
        # 현재 위치에서 DFS 수행
        if dfs(i, j) == True:
            result += 1

print(result) # 정답 출력

 

느낀 점

dfs와 재귀 호출을 통해 문제를 처음 풀어봤다.

어렵다

 

728x90

'코딩테스트 > 이것이 코딩테스트다.(Python)' 카테고리의 다른 글

선택 정렬, 삽입 정렬  (2) 2022.06.25
5-4 미로 탈출  (2) 2022.06.04
4-4 게임 개발  (1) 2022.06.03
4-3 왕실의 나이트  (1) 2022.06.01
4-1 상하좌우  (1) 2022.05.31