Python, 백준 5212, 지구 온난화

알고리즘/백준|2022. 9. 4. 03:15

난이도 : 실버2

링크 : https://www.acmicpc.net/problem/5212


1. 문제 설명

설명

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

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

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

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

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

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


입력

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


출력

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



2. 문제리뷰

1. 지도의 범위를 벗어나는 칸은 모두 바다이므로 입력을 한 번 더 . 으로 감싸 입력에서 외각에 있는 섬도 바다로 감싸지도록 만들었다.

 

2. 그 상태에서 50년 뒤의 바다를 구현한 뒤 남아 있는 섬의 최대, 최소 좌표값을 찾아 해당 부분만큼 출력하면 된다.


3. 소스코드

# 상하좌우 중 3곳 이상 물이면 잠기는 함수
# 큰 바다를 만들어서 X(섬)은 무조건 .(바다)안쪽에 있도록 넣어놨기 떄문에 편함
def GW(yy, xx):
    directy = [-1, 1, 0, 0]
    directx = [0, 0, -1, 1]
    cnt = 0
    for i in range(4):
        dy = directy[i] + yy
        dx = directx[i] + xx

        if arr_big[dy][dx] == '.':
            cnt += 1

    # 큰 바다에서 섬이 무조건 바다로 둘러싸여 있도록 만드느라
    # if arr[y][x] == 'X':
    #      arr_big[y + 1][x + 1] = 'X' 를 사용했으니

    # arr[yy - 1][xx - 1] = '.' 을 해주면 원래 바다의 'X' 위치를 찾을 수 있음
    if cnt > 2:
        arr[yy - 1][xx - 1] = '.'

# 입력 받기
y, x = map(int, input().split())
arr = [list(input()) for _ in range(y)]

# 기존 바다맵을 전부 .으로 감쌀 수 있는 큰 바다를 만듬
arr_big = [['.'] * (x + 2) for _ in range(y + 2)]

# 큰 바다에 섬 넣기
for y in range(len(arr)):
    for x in range(len(arr[y])):
        if arr[y][x] == 'X':
            arr_big[y + 1][x + 1] = 'X'
            
#큰 바다 출력 테스트
# for y in range(len(arr_big)):
#     for x in range(len(arr_big[y])):
#         print(arr_big[y][x], end='')
#     print()

# 큰 바다에서 'X'를 찾으면 GW 함수로 X의 좌표값 가지고 이동
for y in range(len(arr_big)):
    for x in range(len(arr_big[y])):
        if arr_big[y][x] == 'X':
            GW(y, x)

# 섬의 최대, 최소 좌표값 찾기
max_y = 0
max_x = 0
min_x = int(21e8)
min_y = int(21e8)
for y in range(len(arr)):
    for x in range(len(arr[y])):
        if arr[y][x] == 'X':
            if max_y < y:
                max_y = y
            if min_y > y:
                min_y = y
            if max_x < x:
                max_x = x
            if min_x > x:
                min_x = x
print(min_x)
print(min_y)
for y in range(min_y, max_y+1):
    for x in range(min_x, max_x+1):
        print(arr[y][x], end='')
    print()

'알고리즘 > 백준' 카테고리의 다른 글

파이썬, 백준 11047, 동전0  (0) 2022.09.05
Python, 백준 14696, 딱지놀이  (0) 2022.09.04
Python, 백준 2564, 경비원  (0) 2022.09.04
Python, 백준 10157, 자리배정  (0) 2022.09.04
Python, 백준 14499, 주사위 굴리기  (0) 2022.08.30

댓글()