먼저 종료 조건은 (n-1, n-1)에 도착하거나 (x, y)가 배열의 범위를 넘어서는 것입니다.
(n-1, n-1)에 도착하면 파이프를 연결하는 방법의 수가 1가지가 있다는 것이므로 global 키워드를 사용하고, ans += 1을 해주면 됩니다.
defgo(x,y,z):global ansif x == n-1and y == n-1: ans +=1returnn =int(input())arr =list(list(map(int,input().split())) for _ inrange(n))ans =0go(0, 1, 1)
우리는 if문 3개를 이용하여 →, ↘, ↓를 만들 것입니다. 그래서 배열의 범위를 넘어서면 →, ↘, ↓ 파이프를 못 만들기 때문에 그냥 if문을 통과하면 됩니다.
3. 재귀 함수 2( → 구현)
z = 1일 때, 이전 파이프의 방향이 → 이므로 이번에 파이프를 놓을 수 있는 방향은 →, ↘입니다.
먼저 (x, y+1), (x+1, y+1), (x+1, y)가 범위 내에 있는지, 벽이 없는지 확인하는 함수를 만들어줍니다.
defcheck(x,y):if0<= x < n and0<= y < n and arr[x][y] ==0:returnTrueelse:returnFalse
→는 (x, y) - (x, y+1)로 파이프를 이어주는 것이므로 check(x, y+1)이 True이면 파이프를 놓아도 된다는 뜻입니다.
↘는 (x, y) - (x + 1, y + 1)로 파이프를 이어주는 것이므로 check(x, y+1), check(x+1, y), check(x+1, y+1)이 전부 True이면 파이프를 이어주면 됩니다.
defcheck(x,y):if0<= x < n and0<= y < n and arr[x][y] ==0:returnTrueelse:returnFalsedefgo(x,y,z):global ansif x == n-1and y == n-1: ans +=1returnif z ==1:ifcheck(x, y+1):go(x, y+1, 1)ifcheck(x, y+1)andcheck(x+1, y)andcheck(x+1, y+1):go(x+1, y+1, 2)n =int(input())arr =list(list(map(int,input().split())) for _ inrange(n))ans =0go(0, 1, 1)
4. 재귀 함수 3( ↘ 구현)
이전 파이프의 방향이 ↘이면 다음 파이프의 방향은 →, ↘, ↓중 아무것이나 돼도 상관없습니다.
재귀 함수 2와 마찬가지로 check()함수를 이용하여 범위내에 있는 좌표인지, 벽이 없는지 확인해주면 됩니다.
defcheck(x,y):if0<= x < n and0<= y < n and arr[x][y] ==0:returnTrueelse:returnFalsedefgo(x,y,z):global ansif x == n-1and y == n-1: ans +=1returnif z ==1:# →ifcheck(x, y+1):go(x, y+1, 1)ifcheck(x, y+1)andcheck(x+1, y)andcheck(x+1, y+1):go(x+1, y+1, 2)elif z ==2:# ↘ifcheck(x, y+1):go(x, y+1, 1)ifcheck(x, y+1)andcheck(x+1, y)andcheck(x+1, y+1):go(x+1, y+1, 2)ifcheck(x+1, y):go(x+1, y, 3)n =int(input())arr =list(list(map(int,input().split())) for _ inrange(n))ans =0go(0, 1, 1)
5. 재귀 함수 4( ↓ 구현)
이전 파이프의 방향이 ↓가 된다면 다음 파이프의 방향은 ↘, ↓만 가능합니다.
재귀 함수 2, 3과 같이 check() 함수를 이용하여 범위 내에 있는 좌표인지, 벽이 없는지 확인해주시면 됩니다.
defcheck(x,y):if0<= x < n and0<= y < n and arr[x][y] ==0:returnTrueelse:returnFalsedefgo(x,y,z):global ansif x == n-1and y == n-1: ans +=1returnif z ==1:ifcheck(x, y+1):go(x, y+1, 1)ifcheck(x, y+1)andcheck(x+1, y)andcheck(x+1, y+1):go(x+1, y+1, 2)elif z ==2:ifcheck(x, y+1):go(x, y+1, 1)ifcheck(x, y+1)andcheck(x+1, y)andcheck(x+1, y+1):go(x+1, y+1, 2)ifcheck(x+1, y):go(x+1, y, 3)else:ifcheck(x, y +1)andcheck(x +1, y)andcheck(x +1, y +1):go(x+1, y+1,2)ifcheck(x+1, y):go(x+1, y, 3)n =int(input())arr =list(list(map(int,input().split())) for _ inrange(n))ans =0go(0, 1, 1)
이제 재귀 함수를 다 만들었으므로 ans를 출력해주면 됩니다.
defcheck(x,y):if0<= x < n and0<= y < n and arr[x][y] ==0:returnTrueelse:returnFalsedefgo(x,y,z):global ansif x == n-1and y == n-1: ans +=1returnif z ==1:ifcheck(x, y+1):go(x, y+1, 1)ifcheck(x, y+1)andcheck(x+1, y)andcheck(x+1, y+1):go(x+1, y+1, 2)elif z ==2:ifcheck(x, y+1):go(x, y+1, 1)ifcheck(x, y+1)andcheck(x+1, y)andcheck(x+1, y+1):go(x+1, y+1, 2)ifcheck(x+1, y):go(x+1, y, 3)else:ifcheck(x, y+1)andcheck(x+1, y)andcheck(x+1, y+1):go(x+1, y+1, 2)ifcheck(x+1, y):go(x+1, y, 3)n =int(input())arr =list(list(map(int,input().split())) for _ inrange(n))ans =0go(0, 1, 1)print(ans)