STUDY/Algorithm

[백준] 2583 영역구하기

sinawi95 2021. 3. 4. 21:37
728x90

www.acmicpc.net/problem/2583

 

2583번: 영역 구하기

첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오

www.acmicpc.net

from collections import deque


def bfs(row, col):
    q = deque()
    dr = [-1, 1, 0, 0]
    dc = [0, 0, -1, 1]
    q.append((row, col))
    matrix[row][col] = 1
    while q:
        nr, nc = q.popleft()
        for i in range(4):
            if 0 <= nr + dr[i] < m and 0 <= nc + dc[i] < n:
                if matrix[nr + dr[i]][nc + dc[i]] == 1: continue
                q.append((nr + dr[i], nc + dc[i]))
                matrix[nr + dr[i]][nc + dc[i]] = 1
                global area
                area += 1


m, n, k = map(int, input().split())
matrix = [[0] * n for _ in range(m)]
for _ in range(k):
    # r= 4, c = 6
    ld_c, ld_r, ru_c, ru_r = map(int, input().split())
    for r in range(ld_r, ru_r):
        for c in range(ld_c, ru_c):
            matrix[r][c] = 1
cnt, area = 0, 0
area_list = []

for i in range(m):
    for j in range(n):
        if matrix[i][j] == 0:
            cnt += 1
            area = 1
            bfs(i, j)
            area_list.append(area)
print(cnt)
print(*sorted(area_list))

스터디하면서 한시간 정도에 두 문제 풀기로 했고, 그 문제 중 하나이다.

이전부터 해왔던 문제들을 합친 문제이다. 종이 겹치기랑 단지 번호 구하기 였나?

배열을 만들고 겹칠때 좀 헷갈렸지만 그냥저냥 하다보니 풀렸다.

번호를 구하기 위해서 dfs로 할지 bfs로 할지 고민하다가 손에 익힐겸 bfs로 했다.

'STUDY > Algorithm' 카테고리의 다른 글

[백준] 3980 선발명단  (1) 2021.03.05
[백준] 6603 로또  (0) 2021.03.04
[백준] N과 M (시리즈)  (0) 2021.03.04
[백준] 2798 블랙잭  (0) 2021.03.04
[백준] 2309 일곱 난쟁이  (0) 2021.03.04