이번 문제는 처음에 육지에 해당하는 좌표를 모두 리스트로 저장하고, 육지 좌표 리스트를 순회하며 주변 좌표에 육지가 1개 이하일 경우에 해당 육지를 지우도록 하였다. 이때 한번에 지워지는 것이기 때문에 임시 리스트를 선언하여 변경 사항을 임시 리스트에 적용하였다. 출력 범위의 경우에는 지도 리스트를 순회하며 X가 있는 y좌표를 모두 리스트에 담고, X가 있는 x좌표를 모두 담아 이 두 리스트에서 가장 작은 값과 큰 값을 꺼내 범위로 삼아 출력하도록 하였다.
import copy
r, c=map(int, input().split())
grid=[list(map(str, input())) for _ in range(r)]
tmp=copy.deepcopy(grid)
land=[]
for i in range(r):
for j in range(c):
if grid[i][j]=='X':
land.append((i, j))
dy, dx=[0, 1, 0, -1], [1, 0, -1, 0]
for y, x in land:
cnt=0
for i in range(4):
ny, nx=y+dy[i], x+dx[i]
if 0<=ny<r and 0<=nx<c and grid[ny][nx]=='X':
continue
else:
cnt+=1
if cnt>=3:
tmp[y][x]='.'
land=copy.deepcopy(tmp)
idx=[]
lr=[]
for i in range(r):
if 'X' not in set(land[i]):
continue
else:
idx.append(i)
for j in range(c):
if land[i][j]=='X':
lr.append(j)
lr.sort()
for i in range(idx[0], idx[-1]+1):
print(''.join(land[i][lr[0]:lr[-1]+1]))