주어진 그래프와, 그 그래프를 deepcopy한 copied 그래프를 하나 만든다
그래프를 돌면서, 각각의 인덱스에 대한 십자가의 사이즈를 찾는 함수 find에 넣고 돌린다.
- find 함수 내부에서 십자가가 포함된다면 1이상의 사이즈를 리턴하며, 그렇지 않다면 0을 리턴한다. 이때 주의할 점은 십자가를 찾을 때 다음 인덱스가 범위를 벗어나지 않도록 예외처리가 필요하다.
리턴된 사이즈를 가지고, 복사된 그래프에 십자가를 지운다.
복사된 그래프를 1차원으로 변환 후 * 이 남아있다면 십자가는 존재하지만 모든 별을 제거하지 못한 경우이고, result가 0이라면 십자가를 제거할 수 없었다는 뜻이다.
이후 result 결과를 출력한다.
from copy import deepcopy
n, m = map(int, input().split())
graph = [list(input()) for _ in range(n)]
copied = deepcopy(graph)
def find(x, y):
size = 0
if graph[x][y] != '*':
return 0
flag = True
while flag:
size += 1
dx, dy = [1 * size, -1 * size, 0, 0], [0, 0, 1 * size, -1 * size]
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0 <= nx < n and 0 <= ny < m and graph[nx][ny] == '*':
continue
else:
flag = False
break
return size
result = []
for i in range(n):
for j in range(m):
size = find(i, j)
if not size:
continue
if size - 1 != 0:
result.append([i+1, j+1, size-1])
for a in range(size):
dx, dy = [1 * a, -1 * a, 0, 0], [0, 0, 1 * a, -1 * a]
for b in range(4):
nx, ny = i + dx[b], j + dy[b]
copied[nx][ny] = '.'
if result == [] or '*' in sum(copied, []):
print(-1)
exit()
print(len(result))
for r in sorted(result, key= lambda x:(x[0], x[1], -x[2])):
print(*r)