https://www.acmicpc.net/problem/2583
이 문제에서 중요한 점은 입력으로 수학에서의 x, y 축을 받은 후에
27번 줄처럼 코딩할 때는 배열에서의 row, col 으로 바꿔주어야 한다는 것이다.
그래프 문제를 처음 풀었을 때 헷갈렸던 것이 바로 이 x축과 y축을 어떻게 볼 것인가에 대한 문제였는데,
x와 y는 변수 이름으로 쓰지 않고 row와 column만을 쓰는 방식으로 나름대로 해결책을 찾아냈었다.
그런데 이 문제에서는 수학에서의 x축과 y축을 입력으로 줘버린다. 따라서 굉장히 헷갈리는 문제였다.
일단 입력은 그대로 받은 후,
보드판을 검은 색으로 칠할 때 적절한 row와 column을 찾아서 검은색으로 칠해주도록 했다.
한 눈에 규칙이 보이지 않아서 하나하나 대입하며 보드판을 프린트해가면서 규칙을 찾아냈다.
결론은 row는 세로길이 - y - 1 이 되고,
column은 x를 그대로 가져오면 된다.
import sys
WHITE, BLACK = 0, 1
def count_white(start):
count = 1
stack = [start]
visited[start[0]][start[1]] = 1
while stack:
r, c = stack.pop()
for nR, nC in [[r+1, c], [r-1, c], [r, c+1], [r, c-1]]:
if 0 <= nR < m and 0 <= nC < n:
if board[nR][nC] == WHITE:
if not visited[nR][nC]:
visited[nR][nC] = 1
count += 1
stack.append([nR, nC])
return count
def paint_black():
for rec in rectangle:
for x in range(rec[0], rec[2]):
for y in range(rec[1], rec[3]):
board[m-y-1][x] = BLACK # 모눈종이의 x, y를 행렬의 row, col로 바꾸고 칠하기
if __name__ == '__main__':
m, n, k = map(int, sys.stdin.readline().split()) # m=세로 n=가로 k=직사각형 갯수
board = [[0 for _ in range(n)] for _ in range(m)]
visited = [[0 for _ in range(n)] for _ in range(m)]
rectangle = []
ret = []
for _ in range(k):
rectangle.append(list(map(int, sys.stdin.readline().split())))
paint_black()
for row in range(m):
for col in range(n):
if board[row][col] == WHITE and not visited[row][col]:
ret.append(count_white([row, col]))
ret.sort()
print(len(ret))
print(' '.join(map(str, ret)))