티스토리 뷰

알고리즘

백준 2583 - 파이썬

취뽀가자!! 2023. 6. 15. 20:40

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

 

2583번: 영역 구하기

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

www.acmicpc.net

문제 풀이

이 문제에서 포인트는 시작 지점이 왼쪽 아래라는 점과 모눈종이에 지정된 범위만큼 색을 칠해주고 탐색을 시작한다는 점이다.

 

import sys
from collections import deque
input = sys.stdin.readline

m,n,k = map(int, input().split())

INF = 1e9

graph = [[INF] *n for _ in range(m)]
visited = [[False] * n for _ in range(m)]

for _ in range(k):
  startX,startY,endX,endY = map(int, input().split())
  for i in range(startY, endY):
    for j in range(startX,endX):
      graph[i][j] = -1

dx = [-1,1,0,0]
dy = [0,0,-1,1]

def bfs(x, y):
  q = deque()
  q.append((x,y))
  cnt = 1

  visited[x][y] = True
  graph[x][y] = 1

  while q:
    x,y = q.popleft()

    for i in range(4):
      nx = x + dx[i]
      ny = y + dy[i]

      if 0 <= nx < m and 0 <= ny < n and not visited[nx][ny]:
        if graph[nx][ny] != -1:
          q.append((nx,ny))
          visited[nx][ny] = True
          graph[nx][ny] = 1
          cnt += 1

  return cnt

result = []

for i in range(m):
  for j in range(n):
    if graph[i][j] == INF:
      result.append(bfs(i,j))

print(graph)
print(result)
result.sort()
print(len(result))
for i in result:
  print(i, end=" ")

여기서 포인트가 되는 코드는 다음과 같다.

startX,startY,endX,endY = map(int, input().split())
  for i in range(startY, endY):
    for j in range(startX,endX):
      graph[i][j] = -1

시작과 끝의 x와 y를 이중 반복문의 범위로 지정함으로써 탐색하지 말아야 할 범위를 정해준 것이다.

다음은 graph리스트의 출력 결과이다. (가독성을 위해 INF를 0으로 변경)

 

[[0, 0, 0, 0, -1, -1, 0], [0, -1, 0, 0, -1, -1, 0], [-1, -1, -1, -1, 0, 0, 0], [-1, -1, -1, -1, 0, 0, 0], [0, -1, 0, 0, 0, 0, 0]]

 

이제는 기본적인 BFS를 조금 변형시켜 푸는 문제는 웬만해선 다 해결 가능한거 같다. 섣부른 자만일수도 있지만 한편으로는 발전한거 같아 뿌듯하다. 앞으로도 지치지 않게 꾸준히 풀어야겠다.

 

'알고리즘' 카테고리의 다른 글

백준 17141 - 파이썬  (0) 2023.06.24
백준 2644 - 파이썬  (0) 2023.06.16
백준 11725 - 파이썬  (0) 2023.06.13
백준 2468 - 파이썬  (0) 2023.06.11
백준 4963 - 파이썬  (0) 2023.06.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함