백준 5212 Python

Heejun Kim·2022년 5월 15일
0

Coding Test

목록 보기
12/51

문제 출처: https://www.acmicpc.net/problem/5212
이 문제에서 주의해야할 사항은 바로 남아 있는 섬을 표시하고, 그 섬을 '포함한' 직사각형의 지도를 출력하는 것이다. 따라서 직사각형 안에 윗변과 아랫변에 하나의 섬이라도 남아 있다면 그 사이에 있는 바다 역시 출력해 줘야 한다.

# flake8 코드 스타일이 적용되어 있습니다.
import sys
input = sys.stdin.readline


# 좌표 탐색
def traversal(x, y, MAP):
    dx = [1, -1, 0, 0]
    dy = [0, 0, 1, -1]
    count = 0  # 바다로 둘러 쌓여 있는지 확인
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0 <= nx <= R + 1 and 0 <= ny <= C + 1 and MAP[nx][ny] == '.':
            count += 1
    return count


R, C = map(int, input().split())
MAP = [['.' for _ in range(C + 2)] for _ in range(R + 2)]
coord = []  # 좌표 저장
for r in range(1, R + 1):
    temp = input().strip()
    for c in range(1, C + 1):
        MAP[r][c] = temp[c - 1]
        if temp[c - 1] == 'X':
            coord.append([r, c])

# 50년뒤 사라지는지 검사 시작
del_coord = []
for c in coord:
    x = c[0]
    y = c[1]
    if traversal(x, y, MAP) >= 3:
        del_coord.append([x, y])

# 지우기
for c in del_coord:
    x = c[0]
    y = c[1]
    MAP[x][y] = '.'

# 출력할 X, Y 시작, 종료 좌표 찾기
start_x = C + 1
end_x = 0
start_y = R + 1
end_y = 0

for row in range(len(MAP)):
    if 'X' not in MAP[row]:
        continue
    else:
        start_y = min(start_y, row)
        end_y = max(end_y, row)
        for col in range(len(MAP[row])):
            if MAP[row][col] == 'X':
                start_x = min(start_x, col)
                end_x = max(end_x, col)

for row in range(start_y, end_y + 1):
    for col in range(start_x, end_x + 1):
        print(MAP[row][col], end='')
    print()

0개의 댓글