[백준] #5212 지구 온난화(python)

수영·2022년 10월 21일

백준

목록 보기
76/117
post-thumbnail

📌문제

푸르고 아름다운 남해에는 많은 섬이 장관을 이루고 있다. 그림이 아니면 볼 수 없을 것 같은 아름다운 장관을 실제로 볼 수 있는 다도해로 상근이는 여행을 떠났다.

다도해에 도착한 상근이는 서울에서 보던 것과는 다른 풍경에 큰 충격을 받았다. 지구 온난화로 인해 해수면이 상승해 섬의 일부가 바다에 잠겨버렸다.

서울로 다시 돌아온 상근이는 이렇게 지구 온난화가 계속 될 경우 남해의 지도는 어떻게 바뀔지 궁금해졌다.

다도해의 지도는 R*C 크기의 그리드로 나타낼 수 있다. 'X'는 땅을 나타내고, '.'는 바다를 나타낸다.

50년이 지나면, 인접한 세 칸 또는 네 칸에 바다가 있는 땅은 모두 잠겨버린다는 사실을 알았다.

상근이는 50년 후 지도를 그려보기로 했다. 섬의 개수가 오늘날보다 적어질 것이기 때문에, 지도의 크기도 작아져야 한다. 지도의 크기는 모든 섬을 포함하는 가장 작은 직사각형이다. 50년이 지난 후에도 섬은 적어도 한 개 있다. 또, 지도에 없는 곳, 지도의 범위를 벗어나는 칸은 모두 바다이다.

입력

첫째 줄에 지도의 크기 R과 C (1 ≤ R, C ≤ 10)가 주어진다. 다음 R개 줄에는 현재 지도가 주어진다.

출력

50년 후의 지도를 출력한다.

예제 입력1

5 3
...
.X.
.X.
.X.
...

예제 출력1

X

예제 입력2

3 10
..........
..XXX.XXX.
XXX.......

예제 출력2

.XX...X
XX.....

백준 5212번 문제

💡Idea

저는 두 과정으로 나누어서 문제를 해결하였습니다🌊🌄

  1. X 주변을 확인하면서 50년 후에 바다에 잡길 X들을 찾습니다.
  2. 50년 후 남아있는 X들을 포함하는 가장 작은 인덱스 범위를 찾아 출력해줍니다.

💻코드

  • ⏰ 시간 : 68 ms / 메모리 : 30840 KB
import sys

input = sys.stdin.readline
R, C = map(int, input().split())

current_map = ['.' * (C + 2)] + [('.' + input().strip() + '.') for _ in range(R)] + ['.' * (C + 2)]
pos_x = [1, -1, 0, 0]
pos_y = [0, 0, 1, -1]
point_set = set()

for i in range(1, R + 1):
    for j in range(1, C + 1):
        if current_map[i][j] == 'X':
            sea_num = 0
            for k in range(4):
                if current_map[i + pos_x[k]][j + pos_y[k]] == '.': sea_num += 1
            if sea_num < 3: point_set.add((i, j))

x_set = [p[0] for p in point_set]
y_set = [p[1] for p in point_set]
max_x, min_x, max_y, min_y = max(x_set), min(x_set), max(y_set), min(y_set)
for i in range(min_x, max_x + 1):
    for j in range(min_y, max_y + 1):
        if (i, j) not in point_set: print('.', end='')
        else: print('X', end='')
    print()

📝코드 설명

변수

  • current_map : 처음 상태의 지도를 나타내는 변수로, 주변을 '.'로 한 번 감싸줍니다.
    '.'은 바다를 의미하고, 지도에서 표현되지 않은 부분들은 바다로 생각하기 때문에 '.'을 감싸주어도 상관없습니다. 한 번 감싸줌으로써 X 주변의 바다 개수를 확인하기 더 쉬워집니다.

  • pos_x, pos_y : 사방을 확인하기 위한 좌표 리스트

  • point_set : 50년이 지나도 사라지지 않는 섬들의 좌표를 넣어두는 집합입니다.

지도를 확인하면서 50년이 지나도 사라지지 않는 섬들의 좌표를 point_set에 저장해줍니다.

그리고, point_set의 좌표들(남아있는 섬들)을 포함하는 최소의 지도 범위를 찾습니다.
이는 point_set0번째 인덱스와 1번째 인덱스의 max값과 min 값을 각각 계산해주면 됩니다.

그리고 해당 범위에서 출력을 하면서 point_set에 있다면 X를 출력하고 그렇지 않으면 .을 출력해서 문제를 해결해보았습니다.

profile
하고 싶은 건 그냥 죽도록 합니다

0개의 댓글