새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
알고리즘 문제풀이/Python

[백준] 2638 치즈

by 언호 2022. 4. 21.

📖 문제


🧑🏻‍💻 풀이 과정

1) 문제 이해 및 접근

치즈가 포함되어 있는 좌표들과 DFS 를 이용하여 외부의 공기 영역을 우선적으로 구하였습니다.
시간의 흐름에 따라 치즈에서 외부 공기와 두칸 이상 맞닿은 치즈를 없애주었고, 새로 외부 공기 영역을 구하였습니다.

2) 알고리즘

  • DFS

3) 풀이 코드

사용 언어 - Python

import sys
sys.stdin = open('input.txt')

def set_air(melted = []):                                           # 공기의 영역을 새로 구하는 함수
    stack = melted or [(0, 0)]                                      # 녹는 치즈가 있으면 초기값으로 설정 없다면 0,0 을 초기값으로 설정

    while stack:                                                    
        node = stack.pop()
        if not air[node[0]][node[1]]:                               # 탐색하지 않은 영역이면
            air[node[0]][node[1]] = 1                               # 공기로 표시

            for k in range(4):                                      # 이어서 탐색
                r = node[0] + dr[k]
                c = node[1] + dc[k]

                if 0 <= r < N and 0 <= c < M and not board[r][c]:
                    stack.append((r, c))

dr = [-1, 0, 1, 0]                                                          # 위 오른쪽 아래 왼쪽
dc = [0, 1, 0, -1]

N, M = map(int, sys.stdin.readline().split())                               # 세로, 가로
board = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]    # 모눈종이

cheeze = set()                              # 치즈 좌표들 모음
air = [[0] * M for _ in range(N)]           # 공기를 표시한 2차원 배열

set_air()                                   # 초기 공기의 영역을 구함

for i in range(N):                          # 치즈의 좌표들을 구함
    for j in range(M):
        if board[i][j] == 1:
            cheeze.add((i, j))

hour = 0
while cheeze:                               # 치즈가 남아있으면 반복
    hour += 1
    melted = []                             # 녹은 치즈들의 좌표

    for c in cheeze:                        # 치즈 좌표 하나씩 탐색
        cnt = 0

        for k in range(4):                  # 상하좌우 좌표를 새로 구함
            y = c[0] + dr[k]
            x = c[1] + dc[k]

            if air[y][x]:                   # 만약 공기와 맞닿아있으면
                cnt += 1                    # 개수 카운트
        
        if cnt >= 2:                        # 두칸 이상 공기와 맞닿아 있다면,
            melted.append((c[0], c[1]))     # 녹을 치즈 좌표 리스트에 추가

    for item in melted:                     # 현재 치즈에서 녹을 치즈들을 모두 제거
        cheeze.remove(item)
    
    set_air(melted)                         # 녹은 치즈들을 기준으로 하여 공기의 영역 새로 구함

print(hour)

📝 결과 및 학습한 내용

1) 어려웠던 내용

특별히 없습니다.

2) 새롭게 학습한 내용

특별히 없습니다.


🔗 문제 링크

- https://www.acmicpc.net/problem/2638

 

2638번: 치즈

첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5 ≤ N, M ≤ 100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로

www.acmicpc.net

 

 

※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다

'알고리즘 문제풀이 > Python' 카테고리의 다른 글

[백준] 14938 서강그라운드  (0) 2022.04.23
[백준] 17144 미세먼지 안녕!  (0) 2022.04.22
[백준] 2252 줄 세우기  (0) 2022.04.20
[백준] 12852 1로 만들기 2  (0) 2022.04.19
[백준] 1005 ACM Craft  (0) 2022.04.16

댓글