오늘은 여기까지

[백준] 지구 온난화 - Python 파이썬 본문

Problem Solving

[백준] 지구 온난화 - Python 파이썬

dev-99 2024. 10. 16. 18:03

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

 

  1. 원 지도는 탐색용으로 그대로 두고, 50년 후 지도를 그리기 위해 new_map을 deepcopy한다.
  2. 지도 전체를 돌면서 땅이 나오면 상,하,좌,우를 확인한다.
    • 주변이 `"."` 이거나, 지도 범위를 벗어난 경우 모두 바다로 취급하여 cnt를 증가 시킨다.
    • 주변의 세 칸 이상이 바다라면 땅이 잠긴다.
  3. 지도 크기를 최소화한다.
    • 육지('X')를 포함하는 가장 작은 직사각형 영역만을 남기기 위해, 남아있는 땅의 가장 왼쪽, 오른쪽, 위, 아래 좌표를 찾는다.
  4. 해당 범위 내의 지도만을 결과로 출력한다.

전체 코드

import copy

def find_map(R, C, map):
    new_map = copy.deepcopy(map)
    dx = [1, -1, 0, 0]
    dy = [0, 0, 1, -1]
    
    for i in range(R):
        for j in range(C):
            if map[i][j] == "X":
                cnt = 0
                for dir in range(4):
                    nx = i + dx[dir]
                    ny = j + dy[dir]
                    
                    if nx<0 or nx>=R or ny<0 or ny>=C or map[nx][ny] == ".": 
                        cnt += 1
                
                if cnt >= 3: 
                    new_map[i][j] = "."
                    
    # 지도 크기 최소화
    min_x, max_x = C, -1
    min_y, max_y = R, -1
    
    for i in range(R):
        for j in range(C):
            if new_map[i][j] == "X":
                min_x = min(min_x, j)
                max_x = max(max_x, j)
                min_y = min(min_y, i)
                max_y = max(max_y, i)
    
    # 결과 출력
    result = []
    for i in range(min_y, max_y + 1):
        result.append(''.join(new_map[i][min_x:max_x + 1]))
    
    return result
    
R, C = map(int, input().split())
map = [list(input()) for _ in range(R)]
result = find_map(R, C, map)
for row in result:
    print(row)