Algorithm/BOJ
백준 2210 숫자판 점프
삼쓰 웅쓰
2021. 3. 29. 14:34
728x90
출처: www.acmicpc.net/problem/2210
분류: dfs, 완전탐색
접근방식
왔던 칸을 다시 가도 되므로 그냥 보드의 범위를 넘지 않는지만 체크하면서
6자리까지 dfs 로 계속 숫자를 더해주고 set에 담아서 개수를 출력하면 되는 문제였습니다.
저는 다음 칸을 만들고 filter로 범위를 걸러주는 식으로 풀어서 먼저 범위를 체크하고 만드는 것보다 시간이 좀 더 걸린 것 같네요!
해결방법
typealias Point = (r: Int, c: Int)
var board = [[String]]()
var digitSet = Set<String>()
for _ in 0..<5 {
board.append(readLine()!.split(separator: " ").map { String($0) })
}
func nexts(_ p: Point) -> [Point] {
return [
(p.r+1, p.c),
(p.r-1, p.c),
(p.r, p.c+1),
(p.r, p.c-1)
].filter { 0..<5 ~= $0.r && 0..<5 ~= $0.c }
}
func jump(_ p: Point, _ digit: String) {
guard digit.count < 6 else {
digitSet.insert(digit)
return
}
for next in nexts(p) {
jump(next, digit + board[p.r][p.c])
}
}
for r in 0..<5 {
for c in 0..<5 {
jump((r, c), "")
}
}
print(digitSet.count)