이직하고만다(분노)

99클럽 코테 스터디 35일차 TIL + 백준 깊이너비탐색(실버1)

xxo_ohii 2024. 8. 26. 10:10
728x90

 

- 주제 : 깊이 너비 탐색

- 링크 https://www.acmicpc.net/problem/2583

-

import sys
sys.setrecursionlimit(10000)  # 재귀 깊이 제한을 10000으로 설정하여 깊은 재귀 호출을 허용한다

def dfs(x, y):
    global area_count
    area_count += 1  # 현재 영역의 크기를 1 증가하기
    graph[x][y] = 1  # 현재 위치를 방문 처리함. (1로 변경하여 다시 방문하지 않도록)
    
    # 상, 하, 좌, 우로 이동하는 좌표 변환을 위한 리스트
    dx = [-1, 1, 0, 0]  # x 좌표의 변화: 상(-1), 하(+1)
    dy = [0, 0, -1, 1]  # y 좌표의 변화: 좌(-1), 우(+1)
    
    for i in range(4):  # 상, 하, 좌, 우의 4가지 방향에 대해
        nx = x + dx[i]  # 새로운 x 좌표
        ny = y + dy[i]  # 새로운 y 좌표
        
        # 좌표가 유효하고, 아직 방문하지 않은 영역이면 DFS 수행
        if 0 <= nx < M and 0 <= ny < N and graph[nx][ny] == 0:
            dfs(nx, ny)  # 재귀적으로 DFS 호출

# 입력 처리
M, N, K = map(int, input().split())  # M: 세로 크기, N: 가로 크기, K: 직사각형의 수
graph = [[0] * N for _ in range(M)]  # M x N 크기의 2차원 리스트 초기화 (모두 0으로 채움)

# 직사각형 채우기
for _ in range(K):
    x1, y1, x2, y2 = map(int, input().split())  # 직사각형의 좌표 입력 받기
    for i in range(y1, y2):  # y1부터 y2-1까지 세로 범위
        for j in range(x1, x2):  # x1부터 x2-1까지 가로 범위
            graph[i][j] = 1  # 직사각형이 차지하는 영역을 1로 채움

# 영역의 넓이 리스트
areas = []

# 모든 영역을 탐색
for i in range(M):  # 각 행에 대해
    for j in range(N):  # 각 열에 대해
        if graph[i][j] == 0:  # 아직 방문하지 않은 영역(0)이라면
            area_count = 0  # 새로운 영역의 크기 초기화
            dfs(i, j)  # DFS를 통해 연결된 모든 영역 탐색
            areas.append(area_count)  # 탐색된 영역의 크기를 리스트에 추가

# 영역의 넓이를 오름차순으로 정렬하고 출력
areas.sort()  # 영역 크기 리스트를 오름차순으로 정렬
print(len(areas))  # 영역의 개수 출력
print(" ".join(map(str, areas)))  # 각 영역의 크기를 공백으로 구분하여 출력

 

저는 조빱인데 왜 자꾸 이런문제가 나오죠...

비기너랑 미들러랑 착각하셨나요

출제자님 ㅜㅜ...

 

우선 오늘의 배운점은 주석으로 대체

728x90