우선 이 문제는 뜻깊은 문제이다. 백준에서 문제를 푼 개수가 600개가 되었다. 이문제는 그 600번째이다.
600개를 풀면서 드는 생각들은 회고로 적어 놓아야 겠다.
이문제는 dfs를 떠올릴 수 있는 구조이다. k의 거리로 이동한 것을 찾으니까 리턴조건은 당연히 거리가 k인것 + '그 위치에 도착했는가' 이다.
자스 풀이
const input = require("fs")
.readFileSync("./dev/stdin")
.toString()
.trim()
.split("\n")
const [r, c, k] = input[0].split(" ")
const dy = [-1, 0, 1, 0],
dx = [0, 1, 0, -1]
const visited = Array.from({ length: r }, () =>
Array.from({ length: c }, () => false)
)
const board = input.slice(1)
let ans = 0
function dfs(y, x, cnt) {
if (cnt == k && y == 0 && x == c - 1) {
ans += 1
return
}
for (let i = 0; i < 4; i++) {
let ny = y + dy[i],
nx = x + dx[i]
if (
0 <= ny &&
ny < r &&
0 <= nx &&
nx < c &&
!visited[ny][nx] &&
board[ny][nx] != "T"
) {
visited[ny][nx] = true
dfs(ny, nx, cnt + 1)
visited[ny][nx] = false
}
}
}
visited[r - 1][0] = true
dfs(r - 1, 0, 1)
console.log(ans)
파이썬 풀이
import sys
sys.setrecursionlimit(10**9)
input =sys.stdin.readline
r,c,k = map(int,input().split())
board = [input().rstrip() for _ in range(r)]
visited = [[0] * c for _ in range(r)]
ans = 0
def dfs(y, x ,cnt) :
global ans
if y == 0 and x == c - 1 and cnt == k :
ans += 1
return
for dy, dx in (1,0),(-1,0),(0,-1),(0,1) :
ny , nx = dy + y , dx + x
if 0 <= ny < r and 0 <= nx < c and board[ny][nx] != 'T' and visited[ny][nx] == 0:
visited[ny][nx] = 1
dfs(ny, nx, cnt + 1)
visited[ny][nx] = 0
visited[r-1][0] = 1
dfs(r-1, 0, 1)
print(ans)
'알고리즘 > 백준' 카테고리의 다른 글
15681. 트리와 쿼리 (0) | 2022.04.07 |
---|---|
2629. 양팔저울 (0) | 2022.04.06 |
2468. 안전 영역 (0) | 2022.03.25 |
1826. 연료 채우기 (0) | 2022.03.24 |
14500. 테트로미노 (0) | 2022.03.23 |