[Swift] 백준 16173번: 점프왕 쩰리 - BFS자료구조와 알고리즘/알고리즘2024. 3. 8. 17:16
Table of Contents
https://www.acmicpc.net/problem/16173
조건
- ‘쩰리’는 가로와 세로의 칸 수가 같은 정사각형의 구역 내부에서만 움직일 수 있다. ‘쩰리’가 정사각형 구역의 외부로 나가는 경우엔 바닥으로 떨어져 즉시 게임에서 패배하게 된다.
- ‘쩰리’의 출발점은 항상 정사각형의 가장 왼쪽, 가장 위의 칸이다. 다른 출발점에서는 출발하지 않는다.
- ‘쩰리’가 이동 가능한 방향은 오른쪽과 아래 뿐이다. 위쪽과 왼쪽으로는 이동할 수 없다.
- ‘쩰리’가 가장 오른쪽, 가장 아래 칸에 도달하는 순간, 그 즉시 ‘쩰리’의 승리로 게임은 종료된다.
- ‘쩰리’가 한 번에 이동할 수 있는 칸의 수는, 현재 밟고 있는 칸에 쓰여 있는 수 만큼이다. 칸에 쓰여 있는 수 초과나 그 미만으로 이동할 수 없다.
새로운 게임이 맘에 든 ‘쩰리’는, 계속 게임을 진행해 마침내 최종 단계에 도달했다. 하지만, 게임을 진행하는 구역이 너무 넓어져버린 나머지, 이 게임에서 이길 수 있는지 없는지 가늠할 수 없어졌다. ‘쩰리’는 유능한 프로그래머인 당신에게 주어진 구역에서 승리할 수 있는 지 알아봐 달라고 부탁했다. ‘쩰리’를 도와 주어진 게임 구역에서 끝 점(오른쪽 맨 아래 칸)까지 도달할 수 있는지를 알아보자!
게임판의 승리 지점(오른쪽 맨 아래 칸)에는 -1이 쓰여있다.
BFS를 사용한 풀이
import Foundation
// 이동할 수 있는 정사각형 맵 크기 N
let N = Int(readLine()!)!
var arr = [[Int]]()
// 이동할 수 있는 칸 정보
for _ in 0..<N {
let input = readLine()!.components(separatedBy: " ").map { Int(String($0))! }
arr.append(input)
}
// 순환하지 않도록 왔던 칸은 기록
var checked = Array(repeating: Array(repeating: false, count: N), count: N)
// 현재 위치에서 움직일 장소들을 저장
var queue = [[Int]]()
func bfs(start: [Int]) {
queue.append(start)
checked[start[0]][start[1]] = true
while !queue.isEmpty {
let element = queue.removeFirst()
checked[element[0]][element[1]] = true
let m = arr[element[0]][element[1]]
// 종료 조건인 경우에는 함수를 종료
if m == -1 { print("HaruHaru"); return }
// 아래로 갈 수 있다면 확인
if 0..<N ~= element[0]+m, !checked[element[0]+m][element[1]] {
queue.append([element[0]+m, element[1]])
}
// 우측으로 갈 수 있다면 확인
if 0..<N ~= element[1]+m, !checked[element[0]][element[1]+m] {
queue.append([element[0], element[1]+m])
}
}
print("Hing")
}
bfs(start: [0,0])
'자료구조와 알고리즘 > 알고리즘' 카테고리의 다른 글
[Swift] 백준 도넛과 막대 그래프 - 2024 카카오 겨울 인턴십 (0) | 2024.03.18 |
---|---|
[Swift] 프로그래머스 N-Queen - DFS (0) | 2024.03.11 |
[Swift] [leetcode] Implement strStr ... etc (0) | 2022.08.09 |
[Swift] [leetcode] Palindrome Number ... etc (0) | 2022.08.07 |
[Swift] [프로그래머스 1단계] 키패드 누르기 (0) | 2022.08.06 |
@jaewpark :: 코스모스, 봄보다는 늦을지언정 가을에 피어나다
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!