728x90
https://www.acmicpc.net/problem/5212
문제 아이디어
1. 이중 for문을 순회하면서 땅을 찾으면 상하좌우를 확인하여 인접 세칸 이상이 바다인지 확인한다
단!!!! 여기서 지도의 의미는 섬을 포함한 최소 직사각형이므로, 지도 범위인 (r, c)를 초과하면 바다이다
for i in range(r):
for j in range(c):
if array[i][j] == 'X': # 땅이면 인접 세칸 이상이 바다인지 확인하기
count = 0
for k in range(4):
nx = i + dx[k]
ny = j + dy[k]
if 0 <= nx < r and 0 <= ny < c:
if array[nx][ny] == '.':
count += 1 # 인접한 칸 중 바다 개수 세주기
else: # 지도 영역을 초과하면 바다이다
count += 1
continue
잠기는 시점은 동시에 잠기는 것이므로, 인접한 칸 3칸 이상이 바다인 경우인 땅의 좌표를 sink 에 저장한 후 ,
sink 배열에 있는 좌표들만 땅에서 바다로 바꿔준다
# 바다로 바꾸기
if len(sink) > 0:
for x, y in sink:
array[x][y] = '.'
# 5212 지구온난화
r, c = map(int, input().split())
array = [] # 지도
for _ in range(r):
array.append(list(input()))
# 상하좌우 확인하기
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
sink = [] # 잠기게 되는 좌표들의 배열
for i in range(r):
for j in range(c):
if array[i][j] == 'X': # 땅이면 인접 세칸 이상이 바다인지 확인하기
count = 0
for k in range(4):
nx = i + dx[k]
ny = j + dy[k]
if 0 <= nx < r and 0 <= ny < c:
if array[nx][ny] == '.':
count += 1 # 인접한 칸 중 바다 개수 세주기
else:
count += 1
continue
if count >= 3:
sink.append((i, j))
# 바다로 바꾸기
if len(sink) > 0:
for x, y in sink:
array[x][y] = '.'
x1 = 0
y1 = c-1
x2 = 0
y2 = 0
# 지도 범위 구하기
for i in range(0, r):
if 'X' in array[i]:
x1 = i
break
for i in range(r-1, -1, -1):
if 'X' in array[i]:
x2 = i
break
for i in range(x1, x2+1):
for j in range(c):
if array[i][j] == 'X':
y1 = min(y1, j)
y2 = max(y2, j)
# 정답 출력하기
for i in range(x1, x2+1):
for j in range(y1, y2+1):
print(array[i][j], end='')
print()
728x90
'Algorithm (PS)' 카테고리의 다른 글
[백준] 11055 가장 큰 증가 부분 수열 Python (0) | 2022.10.07 |
---|---|
[백준] 15649 N과 M(1) Python (0) | 2022.10.06 |
[Snippet] Python 2차원 배열 한칸씩 밑으로 내리기 (0) | 2022.10.04 |
[백준] 2668 숫자고르기 Python (0) | 2022.10.04 |
[카카오] 등산코스 정하기 Python - 다익스트라 알고리즘 응용 (0) | 2022.10.03 |