728x90
반응형
풀기 전 생각해보기😮
- 이차원 배열의 탐색은 범위를 항상 조심할 것
- 구현 문제
풀이🛫
dcol = [0, 1, 0, -1]
drow = [-1, 0, 1, 0]
def check(col, row, dir): # dir: 바라보는 방향
if dir == 0:
if 0<=col-1 and arr[col-1][row] == 0:
exp(col-1, row, dir)
elif dir == 3:
if 0<=row-1 and arr[col][row-1] == 0:
exp(col, row-1, dir)
elif dir == 2:
if col+1<N and arr[col+1][row] == 0:
exp(col+1, row, dir)
elif dir == 1:
if row+1<M and arr[col][row+1] == 0:
exp(col, row+1, dir)
def exp_except(col, row, dir):
if col+1<N and dir == 0 and arr[col+1][row] != 1:
exp(col+1, row, dir)
elif row+1<M and dir == 3 and arr[col][row+1] != 1:
exp(col, row+1, dir)
elif 0<=col-1 and dir == 2 and arr[col-1][row] != 1:
exp(col-1, row, dir)
elif 0<=row-1 and dir == 1 and arr[col][row-1] != 1:
exp(col, row-1, dir)
def exp(col, row, dir):
global answer, cnt
if arr[col][row] == 0:
answer += 1
cnt += 1
arr[col][row] = cnt
# 4방향 탐색
for i in range(4):
check(col, row, (dir-1-i)%4)
# 네방향 모두 청소가 되어있거나 벽인 경우
exp_except(col, row, dir)
# 위 과정이 모두 통과했을때 정답을 출력하고 종료
print(answer)
exit()
N, M = map(int, input().split())
r, c, d = map(int, input().split()) # r: 가로, c: 세로, d: 방향(0: 북, 1:동, 2:남, 3:서)
arr = [list(map(int, input().split())) for _ in range(N)]
cnt = 1
answer = 0
exp(r, c, d)
핵심 정리🎁
exit() # 함수 재귀와 상관없이 프로그램을 종료시킬 수 있다
링크💎
https://www.acmicpc.net/problem/14503
후기 😎
- 디버깅을 위해 어떻게 값을 표시해나갈지도 잘 알아둘 필요를 느꼈다
- 이차원배열 문제를 풀 때 범위를 고려해야 한다는 것을 잊어버린 탓에 오랫동아 헤메었다.
- (dir-1-i)%4의 규칙성을 발견하는데 애먹었다. 발견하고 나면 별거 아닌데 말이야
- 슬슬 알고리즘 풀이 다시 시작하면서 블로그 활동 재개하기!
'Algorithm Study > Python' 카테고리의 다른 글
[백준 파이썬] #2636. 치즈 (1) | 2022.11.08 |
---|---|
[백준 파이썬] #2146. 다리만들기 (0) | 2022.11.06 |
[백준 파이썬] #1018 체스판 다시 칠하기 (0) | 2022.08.28 |
[백준 파이썬] #2605 줄세우기 (0) | 2022.08.27 |
[백준 파이썬] #2309 일곱 난쟁이 (0) | 2022.08.20 |