Input
첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다.
둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오른쪽 위 꼭짓점의 x, y좌표값이 빈칸을 사이에 두고 차례로 주어진다. 모눈종이의 왼쪽 아래 꼭짓점의 좌표는 (0,0)이고, 오른쪽 위 꼭짓점의 좌표는(N,M)이다. 입력되는 K개의 직사각형들이 모눈종이 전체를 채우는 경우는 없다.
- 좌표로 주어지는 직사각형 외의 공간을 구하는 문제이므로, 주어지는 직사각형의 영역은
1
로 표기해둔다. - 이 때, 좌표로 직사각형이 주어지므로 한 칸에 해당하는 좌표와 이를 구분해야 한다.
- 즉, 한 칸의 영역은
끝 좌표-1
에 해당한다.
1 | m, n, k = map(int, sys.stdin.readline().split()) |
Default
1 | import sys |
DFS
연속되는 공간을 찾을 때, 위/아래/양 옆을 체크하므로
dir
을 미리 세팅한다.출력해야 하는 값이
count
와영역
이므로 이 둘에 해당하는 변수를 생성한다.모든 보드의 칸을 돌면서
0
인 경우 해당 영역의 넓이를 구하고count+1
을 해야 하므로 가장 바깥쪽이자 전체를 도는 for문을 생성한다.- 0임을 체크하면, 다시 이 영역을 count하면 안 되므로 1로 세팅하고, 해당 영역부터 넓이를 체크해야 하므로 area는 1로 초기화, 그리고 dfs를 돈다.
- area를
global
로 설정하여 해당 변수를 result에append
하여 이후 출력값을sort
한다. - 또한, 연속된 0 값을 체크하여 영역을 세는 것이므로
count++
을 수행한다.
1
2
3
4
5
6
7
8for y in range(m):
for x in range(n):
if board[y][x] == 0:
board[y][x] = 1
area = 1
dfs(y, x)
result.append(area)
count += 1연속된 영역을 파악하기 위해 dfs를 돈다.
- 미리 생성해 둔 dir에 따라 연속된 넓이를 체크하고,
- 이 때 범위 내의 값일 경우, 위와 동일하게 칸을 1로 세팅, 넓이를 +1하고 dfs를 이어서 수행한다.
1
2
3
4
5
6
7
8
9
10
11
12def dfs(dy, dx):
global area
for dd in dir:
x = dd[0] + dx
y = dd[1] + dy
if 0 <= x < n and 0 <= y < m:
if board[y][x] == 0:
board[y][x] = 1
area += 1
dfs(y, x)
Output
첫째 줄에 분리되어 나누어지는 영역의 개수를 출력한다.
둘째 줄에는 각 영역의 넓이를 오름차순으로 정렬하여 빈칸을 사이에 두고 출력한다.
int 배열 값을 str으로 하나씩 출력하는 법
' '.join(map(str, arr))
를 통해1 7 13
과 같이int 값을 str로 mapping하고 한 칸 띄어쓰기를 join 한다.
런타임 에러가 뜰까봐 sys를 이용하는데, 알고리즘은 다 맞아놓고 자꾸 출력 형식에서 틀린다… 바보야…!!!!!!
1 | result.sort() |