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)
개인적인 후기
- 코드 가독성에 대해 고민을 많이 하게되는 문제
- 바다를 정리하는 코드를 하나의 함수로 만들고 싶었으나, 그렇게 할 경우 코드가 너무 복잡해진다는 느낌을 받아 상하 // 좌우로 구별
'알고리즘 문제 풀이 > Python' 카테고리의 다른 글
python 백준 31713 행운을 빌어요 (1) | 2024.11.20 |
---|---|
python 백준 20056 마법사 상어와 파이어볼 (0) | 2024.11.18 |
python 백준 14620 (0) | 2024.10.31 |
python 백준 2056 작업 (0) | 2024.10.02 |
python 백준 수영장 만들기 (0) | 2024.08.21 |