알고리즘 문제 풀이/Python

python 백준 5212 지구 온난화

맛대 2024. 11. 1. 17:29

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

로직

  • 단순 구현 문제
  • 땅의 상하좌우를 탐색해서 바다가 3면 이상이면 list에 기록(바다로 한번에 바꾸기 위해)
    • 바로 바다로 바꾸면 주변에 있는 땅에도 영향이 미치기에
  • 지도의 상단,하단에서 땅이 있는지 확인하고, 모두가 바다면 ''로 변경
def clearArrRow(R,C,arr,asc):
    range_r = range(R) if asc else range(R-1,-1,-1)
    flag = True
    for r in range_r:
        if flag == False: break
        for c in range(C):
            if arr[r][c] == groundSign:
                flag = False
                break
        else:
            for c in range(C):
                arr[r][c] = ''
def clearArrCol(R,C,arr,asc):
    range_c = range(C) if asc else range(C - 1, -1, -1)
    flag = True
    for c in range_c:
        if flag == False: break
        for r in range(R):
            if arr[r][c] == groundSign:
                flag = False
                break
        else:
            for r in range(R):
                arr[r][c] = ''

def solution(R,C,arr,groundSign,seaSign):
    ls = list()
    dr,dc = (1,-1,0,0),(0,0,1,-1)
    for r in range(R):
        for c in range(C):
            if arr[r][c] == seaSign:continue
            cnt = 0
            for d in range(4):
                nr,nc = r+dr[d],c+dc[d]
                if not (0<=nr<R and 0<=nc<C) or arr[nr][nc] == seaSign:
                    cnt += 1
            if cnt >= 3: ls.append((r,c))
    while ls:
        r,c = ls.pop()
        arr[r][c] = seaSign
    clearArrCol(R,C,arr,True)
    clearArrCol(R,C,arr,False)
    clearArrRow(R,C,arr,True)
    clearArrRow(R,C,arr,False)
    return arr

R,C = map(int,input().split())
arr = [list(input()) for _ in range(R)]
groundSign = 'X'
seaSign = '.'
ans = solution(R,C,arr,groundSign,seaSign)
I = len(ans)
for i in range(I):
    value = ''.join(ans[i])
    if value: print(value)

개인적인 후기

  • 코드 가독성에 대해 고민을 많이 하게되는 문제
  • 바다를 정리하는 코드를 하나의 함수로 만들고 싶었으나, 그렇게 할 경우 코드가 너무 복잡해진다는 느낌을 받아 상하 // 좌우로 구별