코테 노트/백준

백준 2583 영역 구하기 Python 3

화요밍 2022. 2. 13. 19:01
728x90
반응형

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

 

2583번: 영역 구하기

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

www.acmicpc.net

 

최종 코드

 

GitHub - hwayeon351/BEAKJOON-Algorithms: 백준 알고리즘 소스 코드 모음

백준 알고리즘 소스 코드 모음. Contribute to hwayeon351/BEAKJOON-Algorithms development by creating an account on GitHub.

github.com

import sys
sys.setrecursionlimit(10001)
def dfs(x, y):
    global answer
    answer += 1
    for ddx, ddy in zip(dx, dy):
        nx, ny = x+ddx, y+ddy
        if 0 <= nx <N and 0 <= ny < M and not paper[ny][nx] and not visit[ny][nx]:
            visit[ny][nx] = 1
            dfs(nx, ny)

input = sys.stdin.readline
M, N, K = map(int, input().split())
paper = [[0]*N for _ in range(M)]
for _ in range(K):
    sx, sy, ex, ey = map(int, input().split())
    for x in range(sx, ex):
        for y in range(sy, ey):
            paper[y][x] = 1

visit = [[0]*N for _ in range(M)]
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
answer = 0
area = 0
result = []
for y in range(M):
    for x in range(N):
        if visit[y][x] + paper[y][x] == 0:
            answer = 0
            visit[y][x] = 1
            dfs(x, y)
            result.append(answer)
            area += 1
print(area)
result.sort()
for r in result:
    print(r, end=' ')

풀이 과정

풀이 시간 31분

import sys
sys.setrecursionlimit(10001)
input = sys.stdin.readline

def dfs(x, y):
    #영역의 넓이 카운팅
    global answer
    answer += 1
    
    #인접한 4방향 탐색
    for ddx, ddy in zip(dx, dy):
        nx, ny = x+ddx, y+ddy
        #영역 안에 있으면서 빈 칸이고 이전에 방문하지 않은 칸이라면, 방문한다
        if 0 <= nx < N and 0 <= ny < M and not paper[ny][nx] and not visit[ny][nx]:
            visit[ny][nx] = 1
            dfs(nx, ny)

#입력 받아오기
M, N, K = map(int, input().split())
paper = [[0]*N for _ in range(M)]
for _ in range(K):
    sx, sy, ex, ey = map(int, input().split())
    for x in range(sx, ex):
        for y in range(sy, ey):
            paper[y][x] = 1

#영역 방문 처리
visit = [[0]*N for _ in range(M)]

#좌 상 우 하
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]

#각 영역의 넓이
answer = 0
#영역 개수
area = 0
#영역의 넓이들을 담을 배열
result = []

for y in range(M):
    for x in range(N):
    	# (x, y) 칸이 이전에 방문한 적 없으면서 빈 칸인 경우, dfs 탐색 시작
        if visit[y][x] + paper[y][x] == 0:
            answer = 0
            visit[y][x] = 1
            dfs(x, y)
            result.append(answer)
            area += 1
print(area)
result.sort()
for r in result:
    print(r, end=' ')

#시간복잡도 = O(V+E), 공간복잡도 = O(n)

 

728x90
반응형

'코테 노트 > 백준' 카테고리의 다른 글

백준 10026 적록색약 Python 3  (0) 2022.02.14
백준 1743 음식물 피하기 Python 3  (0) 2022.02.14
백준 7562 나이트의 이동 Python 3  (0) 2022.02.10
백준 2644 촌수계산 Python 3  (0) 2022.02.10
백준 1525 퍼즐 Python 3  (0) 2022.02.10