Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- concurrency control
- 쉬운 코드
- BreadcrumbsComputer-Networking_A-Top-Down-Approach
- SDK
- 시그널 핸들러
- recoverability
- CPU 스케줄링
- 반효경
- 온디바이스AI
- 코딩애플
- 시스템프로그래밍
- 데이터베이스
- 백엔드
- 트랜잭션
- 운영체제와 정보기술의 원리
- B tree 데이터삽입
- 코딩테스트 [ ALL IN ONE ]
- 김영한
- 갤럭시 S24
- 개발남노씨
- 인터럽트
- 운영체제
- Extendable hashing
- 커널 동기화
- vite
- Git
- 쉬운코드
- SQL
- 네트워크
- 프로세스 주소 공간
Archives
- Today
- Total
티끌모아 태산
[백 준/DFS/BFS] 2583: 영역 구하기 본문
728x90
https://www.acmicpc.net/problem/2583
2583번: 영역 구하기
첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오
www.acmicpc.net

핵심 아이디어
먼저 0으로 초기화된 배열을 생성해준다. 그리고 직사각형이 포함된 영역에 대해 1을 더해준다.
- DSF 탐색 알고리즘 활용. (BFS로도 가능)
- setrecursionlimit(10**6) 재귀의 깊이를 늘려줘야함
import sys
sys.setrecursionlimit(10**6)
m, n, k = map(int, input().split())
# 처음에 그래프를 0으로 초기화
graph = [[0] * n for _ in range(m)]
for _ in range(k):
x1,y1,x2,y2 = map(int, input().split())
# 사각형이 있는 부분을 1로 만든다.
for i in range(y1,y2):
for j in range(x1,x2):
graph[i][j] = 1
def dfs(x,y):
global count
if x < 0 or x >=m or y < 0 or y >=n:
return False
if graph[x][y] == 0: # 분리된 영역이라면
count += 1 # 넓이를 구하기 위해 1 증가
graph[x][y] = 1 # 방문했다는 의미로 1로 바꿔줌
dfs(x-1,y)
dfs(x+1,y)
dfs(x,y-1)
dfs(x,y+1)
return True
return False
result = 0 # 분리된 영역 개수 셀 변수
count = 0 # 각 영역의 넓이를 셀 변수
ans = [] # 넓이를 넣어줄 list
for i in range(m):
for j in range(n):
if dfs(i,j): # 분리된 영역을 구했다면
result += 1
ans.append(count)
count = 0 # 영역의 넓이 초기화
ans.sort()
print(result)
for i in ans:
print(i, end=' ')
그래프 모양에 대해서 다시 살펴보면 다음과 같다. 이 그래프를 뒤짚으면 문제에서 요구하는 표가 된다.
temp = [[0] * n for _ in range(m)]
for _ in range(k):
x1,y1,x2,y2 = map(int, input().split())
for i in range(y1,y2):
for j in range(x1,x2):
temp[i][j] = 1
for i in temp:
print(i)
[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]
temp = [[0] * n for _ in range(m)]
for _ in range(k):
x1,y1,x2,y2 = map(int, input().split())
for i in range(y1,y2):
for j in range(x1,x2):
temp[i][j] = 1
temp_reversed = temp[::-1]
for i in temp_reversed:
print(i)
[0, 1, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 0, 0, 0]
[1, 1, 1, 1, 0, 0, 0]
[0, 1, 0, 0, 1, 1, 0]
[0, 0, 0, 0, 1, 1, 0]
참고 블로그
처음에 구글링을 하다 내가 짠 로직과 비슷하지만 뭔가 달라서 헤매던 와중에 나와 로직이 똑같은 블로그를 발견하고 참고하였다.
https://codingwonny.tistory.com/171
백준 2583 번. 영역 구하기 (Python / 파이썬)
문제 눈금의 간격이 1인 M×N(M,N≤100)크기의 모눈종이가 있다. 이 모눈종이 위에 눈금에 맞추어 K개의 직사각형을 그릴 때, 이들 K개의 직사각형의 내부를 제외한 나머지 부분이 몇 개의 분리된 영
codingwonny.tistory.com
728x90
'백준 문제 > BFS,DFS' 카테고리의 다른 글
[필수]백준 : 감시_15683 (0) | 2024.01.31 |
---|---|
[백 준/DFS/BFS] 1992: 쿼드트리 (1) | 2024.01.05 |
[백 준/DFS/BFS] 1012: 유기농 배추 (2) | 2024.01.04 |