본문 바로가기
Algorithm(BOJ, Python)/Simulation

[백준_5215] 지구온난화 python

by kurooru 2022. 8. 9.

뭔가 더 잘 풀수 있을 것 같은데,,

확실히 시뮬레이션 단원이 코드가 길게 나오는 것 같다.

# r, c 입력
r, c = map(int, input().split())

# grid
grid = [
    [0] * c
    for _ in range(r)
]

# grid 채워넣기
for i in range(r):
    a = input()
    for j in range(len(a)):
        # 육지는
        if a[j] == 'X':
            # 1로 표시
            grid[i][j] = 1

# temp
temp  = [
    [1] * c
    for _ in range(r)
]

# in_range(x, y)
def in_range(x, y):
    return 0 <= x and x < r and 0 <= y and y < c

# check(x,y)
def check(x, y):

    # cnt
    cnt = 0

    # 동서남북 -> 순서 상관 없음
    dxs, dys = [-1, 1, 0, 0], [0, 0, -1, 1]

    # 조사 시작
    for dx, dy in zip(dxs, dys):
        
        # 조사 위치
        nx, ny = x + dx, y + dy

        # 격자 밖이면
        if not in_range(nx, ny):
            # 바다임
            cnt += 1
        
        # 격자 안에 있고, 조사 위치가 0이면
        elif grid[nx][ny] == 0:
            # 바다임
            cnt += 1

    # 조사 후 바다가 3면 이상이면
    if cnt >= 3:
        # 침수
        return True
    # 이하면 살아남음
    return False 

# find_min_x()
def find_min_x():

    # 탐색 시작
    for i in range(r):
        for j in range(c):
            # 육지 발견하면
            if grid[i][j] == 1:
                # 그 가로줄 반환
                return i

# find_max_x()
def find_max_x():

    # 최댓값 설정
    M = -1

    # 탐색 시작
    for i in range(r):
        for j in range(c):
            # 육지를 발견할 때마다
            if grid[i][j] == 1:
                # 최댓값 갱신
                M = i
    
    # 최댓값 반환
    return M

# find_min_y()
def find_min_y():

    # 최솟값 설정
    m = 11

    # 탐색 시작
    for i in range(r):
        for j in range(c):
            # 육지 발견하고, 최솟값보다 열값이 작으면
            if grid[i][j] == 1 and j < m:
                # 최솟값 업데이트
                m = j
    
    # 최솟값 반환
    return m


# find_max_y()
def find_max_y():

    # 최댓값 설정
    M = -1

    # 탐색 시작
    for i in range(r):
        for j in range(c):
            # 육지를 발견하고, 최댓값보다 열값이 크다면
            if grid[i][j] == 1 and j > M:
                # 최댓값 갱신
                M = j
    
    # 최댓값 반환
    return M

# 설계
# 1. 바꿀 위치 찾아 temp에 기록
for i in range(r):
    for j in range(c):
        # grid의 삼면이나 사면이 바다이면
        if check(i, j):
            # temp[i][j]가 0으로 바뀜
            temp[i][j] = 0

# 2. grid 바꿔주기
for i in range(r):
    for j in range(c):
        # temp 에서 바다가 된 곳이면
        if temp[i][j] == 0:
            # 바다로 바꿔 줌
            grid[i][j] = 0

# 3. x 최솟 값, y 최솟 값, x 최댓값, y 최댓값 찾기
min_x = find_min_x()
max_x = find_max_x()
min_y = find_min_y()
max_y = find_max_y()

# 4. 출력
for i in range(min_x, max_x + 1):
    for j in range(min_y, max_y + 1):
        # 육지라면
        if grid[i][j] == 1:
            print('X', end='')
        # 바다라면
        else:
            print('.', end='')
    print()