문제
Python 문법
해결 과정
- 이중포문으로 섬일 때 상하좌우가 바다인지 확인한다.
- 섬이 없다면 밑에 조건에 의해 1개라도 있어야하니까 섬의 갯수를 확인하면서 반복문을 돈다.
land_cnt += 1
- 모서리에 섬이 있을 경우
- 상하좌우는 지도 범위 밖으로 넘어가며 해당 칸은 바다로 취급하여 카운트한다.
- 모서리가 아닌 부분에 섬이 있을 경우
- 카운트한 값이 3이상일 때 해당 섬을 바다로 바꿔서 새로운 리스트(
result
)에 넣는다.
- 섬을 바다로 바꿨으므로
land_cnt -= 1
- 모든 섬을 포함하는 가장 작은 직사각형의 지도 크기를 만들어야한다.
- 우선 섬이 한개도 없다면
X
를 출력
- 섬이 있다면
- 'X'가 있는 첫 행 (
startR
)
- 'X'가 있는 마지막 행 (
endR
)
- 첫 행부터 마지막 행까지 번갈아가면서 열을 확인한다.
- 해당 행과 열이 'X'라면 해당 열을
idx
에 넣는다.
- 즉
idx
는 'X'가 있는 열의 인덱스
시행착오
- 잠긴다는 건 바다로 변한다는 건가? -> 바다로 변하는 건데 바다로 변한 섬을 카운트 하면 안됨
- 파이썬 리스트 복사..
- 왜 틀린거지 예시는 맞는데요
import sys
import copy
R, C = map(int,sys.stdin.readline().split())
graph = []
for _ in range(R):
graph.append(list(sys.stdin.readline().strip()))
result = copy.deepcopy(graph)
dx = [0,0,-1,1]
dy = [-1,1,0,0]
for i in range(R):
for j in range(C):
cnt = 0
if graph[i][j] =='X':
for z in range(4):
nx = i + dx[z]
ny = j + dy[z]
if 0 > nx or nx >= R or 0 > ny or ny >= C:
cnt += 1
elif graph[nx][ny] == '.':
cnt += 1
if cnt >= 3:
result[i][j] = '.'
answer = []
for i in result:
if 'X' in i:
answer.append(i)
start = 0
end = len(result[0]) - 1
flag = True
while flag:
for i in answer:
if i[start] == 'X':
flag = False
break
else:
start += 1
flag = True
while flag:
for i in answer:
if i[end] == 'X':
flag = False
break
else:
end -= 1
for i in answer:
print(''.join(i[start:end+1]))
풀이
import sys
import copy
R, C = map(int,sys.stdin.readline().split())
graph = []
for _ in range(R):
graph.append(list(sys.stdin.readline().strip()))
result = copy.deepcopy(graph)
land_cnt = 0
dx = [0,0,-1,1]
dy = [-1,1,0,0]
for i in range(R):
for j in range(C):
if graph[i][j] =='X':
cnt = 0
land_cnt += 1
for z in range(4):
nx = i + dx[z]
ny = j + dy[z]
if 0 > nx or nx >= R or 0 > ny or ny >= C:
cnt += 1
elif graph[nx][ny] == '.':
cnt += 1
if cnt >= 3:
result[i][j] = '.'
land_cnt -= 1
if land_cnt == 0:
print('X')
else:
startR = 0
endR = 0
for i in range(R):
if 'X' in result[i]:
startR = i
break
for i in range(R-1,-1,-1):
if 'X' in result[i]:
endR = i
break
idx = []
for j in range(C):
for i in range(startR, endR + 1):
if 'X' == result[i][j]:
idx.append(j)
break
for i in result[startR:endR+1]:
print(''.join(i[idx[0]:idx[-1]+1]))