BOJ : 2636 치즈

김가영·2020년 10월 22일
0

Algorithm

목록 보기
15/78
post-thumbnail

bfs를 이용했다. 처음엔 가장자리가 모두 default로 공기인 것을 모르고 가장자리 중 공기가 있는 부분을 찾아 start 리스트에 넣어준 후 bfs를 돌렸는데 실패가 떴다. (0,0)만 넣어주게 바꾸니 바로 성공했는데 왜일까,,

import sys
from collections import deque
# 치즈가 모두 녹아 없어지는 데 걸리는 시간과, 모두 녹기 한 시간 전에 치즈 조각이 놓여있는 칸의 개수를 구하자
sys.setrecursionlimit(11111)

def isCheeze(h, w):
    if cheeze[h][w] == 1:
        return True
    return False


def bfs(group, day):
    cheeze = set()
    air = set()
    for h, w in group:
        global visit
        visit[h][w] = day
        for (i, j) in [(1,0),(-1,0),(0,1),(0,-1)]:
            new_h, new_w = (h + i, w + j)
            if 0 <= new_h < height and 0 <= new_w < width:
                if isCheeze(new_h, new_w) and (visit[new_h][new_w] == -1 or visit[new_h][new_w] > day + 1):
                    cheeze.add((new_h, new_w))
                elif not isCheeze(new_h, new_w) and (visit[new_h][new_w] == -1 or visit[new_h][new_w] > day):
                    air.add((new_h, new_w))
    if air:
        bfs(air, day)
    if cheeze:
        bfs(cheeze, day + 1)



input = sys.stdin.readline

height, width = list(map(int, list(input().strip().split())))

cheeze = [list(map(int, list(input().strip().split()))) for _ in range(height)]
# (x,y)좌표 cheeze => cheeze[y - 1][x - 1]
visit = [[-1] * width for _ in range(height)]

# 처음 가장자리 중 공기가 있는 부분 찾기
start = [(0,0)]
# for h in [0, height - 1]:
#     for w in range(0, width):
#         if not isCheeze(h, w):
#             start.append((h, w))
# for w in [0, width - 1]:
#     for h in range(0, height):
#         if not isCheeze(h, w):
#             start.append((h, w))
day = 0
bfs(start, day)



max = 0
max_count = 0
for h in range(height):
    for w in range(width):
        if visit[h][w] > max and isCheeze(h, w):
            max = visit[h][w]
            max_count = 1
        elif visit[h][w] == max and isCheeze(h, w):
            max_count += 1

print(max)
print(max_count)
profile
개발블로그

0개의 댓글