bfs: queue에 들어가기전 visited 체크하기

 

 

문제

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

 

나의 풀이

이론적으로 알고 있는 내용이라도, 알고리즘의 순서에 따라서 디버깅이 아주 어려워지는 경우가 있습니다.
제 경우에는 queue에서 들어간 후 count를 해주는 방식으로 먼저 구현을 했었는데, count가 안된 이웃이 중복되어 count되는 경우가 발생하는 것을 확인할 수 있었습니다.

visited 체크를 어디서 해야하는지 슈도코드등을 통해 먼저 검증을 해보고 코드를 작성하면 위와 같은 실수를 줄일 수 있을 것입니다.

import sys

read = lambda: sys.stdin.readline().strip()


def mapping_square(m: int, n: int, k: int) -> list:
    _map = [[0] * m for _ in range(n)]
    for _ in range(k):
        x_1, y_1, x_2, y_2 = map(int, read().split())
        for i in range(x_1, x_2):
            for j in range(y_1, y_2):
                _map[i][j] = 1
    return _map


def count_area(m: int, n: int, _map: list) -> (int, list):
    count = 0
    area = 0
    area_list = []
    direction = [(0, 1), (0, -1), (1, 0), (-1, 0)]
    for i in range(n):
        for j in range(m):
            if _map[i][j] == 0:
                count += 1
                q = [(i, j)]
                while q:
                    x, y = q.pop()
                    area += 1
                    # 이 부분이랑
                    _map[x][y] = 1
                    for go_x, go_y in direction:
                        if (
                            0 <= go_x + x < n
                            and 0 <= go_y + y < m
                            and _map[go_x + x][go_y + y] == 0
                        ):
                            q.append((go_x + x, go_y + y))
                            # 이 부분 유의해서 작성하기 
                            _map[go_x + x][go_y + y] = 1
                area_list.append(area)
                area = 0

    return count, area_list


if __name__ == "__main__":
    m, n, k = map(int, read().split())
    _map = mapping_square(m, n, k)
    count, area_list = count_area(m, n, _map)
    print(count)
    area_list.sort()
    for area in area_list:
        print(area, end=" ")

댓글남기기