한번만 상하좌우를 계산하여 지우면 되는 간단한 문제이다. 주의해야할 점으로는 입력값을 matrix로 구현한 다음 deepcopy를 써야하는 것인데 2차원배열부터는 copy나 [:]로 복사가 안되기 때문이다.
dy와 dx를 통해 상하좌우를 검색하고 범위를 넘어가는 경우도 바다로 처리하기 때문에 이것도 처리해야한다.
이후 바다만 있는 row와 column을 빼고 print하면 끝이 난다.
문제링크
from sys import stdin
import copy
R, C = map(int, stdin.readline().split())
matrix = [list(input()) for _ in range(R)]
result = copy.deepcopy(matrix)
dy = [-1,0,1,0]
dx = [0,-1,0,1]
for y in range(R):
for x in range(C):
count = 0
if matrix[y][x] == '.':
continue
for i in range(4):
ny = y + dy[i]
nx = x + dx[i]
if 0 <= ny < R and 0 <= nx < C:
if matrix[ny][nx] == '.':
count += 1
else:
count += 1
if count >= 3:
result[y][x] = '.'
start_y, end_y = 0, 0
for i in range(R):
if 'X' in result[i]:
start_y = i
break
for i in range(R-1, -1,-1):
if 'X' in result[i]:
end_y = i
break
tmp = []
for j in range(C):
for i in range(start_y, end_y + 1):
if 'X' == result[i][j]:
tmp.append(j)
break
for y in range(start_y, end_y+1):
print("".join(result[y][tmp[0]:tmp[-1]+1]))