[백준] 2636번, 치즈 (Python)

2021. 7. 8. 19:55·알고리즘/백준
728x90
반응형

문제

https://www.acmicpc.net/problem/2636

 

2636번: 치즈

아래 <그림 1>과 같이 정사각형 칸들로 이루어진 사각형 모양의 판이 있고, 그 위에 얇은 치즈(회색으로 표시된 부분)가 놓여 있다. 판의 가장자리(<그림 1>에서 네모 칸에 X친 부분)에는 치즈가 놓

www.acmicpc.net

 

코드

import collections

n, m = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(n)]

def bfs():
    queue = collections.deque()
    queue.append((0,0))
    check = [[False] * m for _ in range(n)]
    dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
    count = 0
    while queue:
        x, y = queue.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < n and 0 <= ny < m:
                if graph[nx][ny] == 0 and check[nx][ny] == False:
                    check[nx][ny] = True
                    queue.append((nx,ny))
                # (0,0) 에서 시작해서 처음 만나는 1들은 모두 가장자리이다.
                elif graph[nx][ny] == 1:
                    # queue에 추가해주는게 아니라 0으로 바꿔줘 녹게만들어준다.
                    graph[nx][ny] = 0
                    count += 1
                    check[nx][ny] = True
    return count

result = []
time = 0
while True:
    count = bfs()
    result.append(count)
    # count가 0이면 모든 치즈가 녹았다는 소리이다.
    if count == 0:
        break
    time += 1

print(time)
# 한시간 전에(모두 녹기전 단계) count를 출력해야 되므로 [-2]를 출력한다.
print(result[-2])

치즈가 1로 주어지는데 가장 자리 치즈들이 먼저 녹기 시작하고 몇 시간만에 모두 녹게 되는지랑 모두 녹기 한시간전에 몇개의 치즈가 남았는지 출력하는 문제이다.

 

가장자리 치즈인지 판단하는게 가장 키포인트인 문제였다..

 

행렬이 주어졌을때 가장 바깥쪽은 치즈가 놓일수 없으므로 항상 (0,0)부터 시작해 상하좌우로 확인을 하는데 처음 1이 나오는 곳들이 가장자리이다.

그래서 1을 발견하면 0으로 만들어 녹게해주고 queue에 넣지않는다.(한번 실행할때 가장자리 치즈만 없애주므로 계속 queue에 넣어줄 필요가 없다.)

 

치즈가 모두 녹을때까지 무한루프를 돌아 얼마큼에 시간이 걸렸는지랑 모두 녹기 한시간전에 값을 출력해주면된다.

반응형
저작자표시 (새창열림)

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 11057번, 오르막 수 (Python)  (0) 2021.07.14
[백준] 7562번, 나이트의 이동 (Python)  (0) 2021.07.09
[백준] 2468번, 안전영역 (Python)  (0) 2021.07.08
[백준] 2667번, 단지번호붙이기 (Python)  (0) 2021.07.08
[백준] 1012번, 유기농 배추 (Python)  (0) 2021.07.06
'알고리즘/백준' 카테고리의 다른 글
  • [백준] 11057번, 오르막 수 (Python)
  • [백준] 7562번, 나이트의 이동 (Python)
  • [백준] 2468번, 안전영역 (Python)
  • [백준] 2667번, 단지번호붙이기 (Python)
wookcode
wookcode
공부한 내용들을 정리하고 기록하는 블로그입니다.
    반응형
  • wookcode
    wookcode
    wookcode
  • 전체
    오늘
    어제
    • 카테고리 (196)
      • study (1)
        • 아파치 카프카 애플리케이션 프로그래밍 with 자.. (0)
        • 인프런 (1)
      • Live Study (15)
      • Programming (14)
        • Java (8)
        • Python (1)
        • Springboot (5)
        • MSA (0)
      • 알고리즘 (117)
        • 백준 (58)
        • 프로그래머스 (59)
      • 에러로그 (5)
      • 항해99 (23)
      • 면접 (1)
      • 프로젝트 (1)
      • CS (19)
        • 네트워크 (2)
        • 운영체제 (2)
        • 데이터베이스 (2)
        • 컴퓨터구조 (1)
        • Java (8)
        • Spring (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    버그
    정리
    브루트포스
    조합
    해결
    항해99
    SpringBoot
    그리디
    항해마켓
    후기
    스파르타코딩클럽
    java
    인프런
    김영한
    백준
    실전프로젝트
    카카오인턴
    카카오코딩테스트
    spring
    SFlash
    에러
    orm
    회고
    프로그래머스
    미니프로젝트
    알고리즘
    괄호
    jpa
    코딩테스트
    파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
wookcode
[백준] 2636번, 치즈 (Python)
상단으로

티스토리툴바