HIT해
[Swift/프로그래머스] 리코쳇 로봇 (BFS) 본문
728x90
https://school.programmers.co.kr/learn/courses/30/lessons/169199
N-Queen 문제처럼 끝까지 dx dy 좌표 이동을 끝까지 한뒤에 걸리는 게 있는 지 없는 지 판별을 하는 방식으로 구현하는 문제였다.
import Foundation
func solution(_ board:[String]) -> Int {
let dx = [-1,0,1,0]
let dy = [0,1,0,-1]
// 큐에 이동 횟수도 함께 저장
var queue = [(x: Int, y: Int, count: Int)]()
var visited = Set<String>()
var map = [[Character]](repeating: [], count : board.count)
for (index , i) in board.enumerated() {
let arr = Array(i)
map[index] = arr
}
let maxY = board[0].count - 1
let maxX = board.count - 1
var start : (Int,Int) = (0,0)
var end : (Int,Int) = (0,0)
for i in 0...maxX {
for j in 0...maxY {
if map[i][j] == "R" {
start = (i,j)
}
if map[i][j] == "G" {
end = (i,j)
}
}
}
// 시작점에서의 이동 횟수는 0
queue.append((x: start.0, y: start.1, count: 0))
visited.insert("x\(start.0)y\(start.1)")
while !queue.isEmpty {
let point = queue.removeFirst()
let x = point.x
let y = point.y
let count = point.count
for i in 0...3 {
var r = x
var c = y
while true {
let nr = r + dx[i]
let nc = c + dy[i]
if nr < 0 || nr > maxX || nc < 0 || nc > maxY || map[nr][nc] == "D" {
if (r,c) == end {
return count+1 // 현재까지의 이동 횟수 반환
}
if !visited.contains("x\(r)y\(c)") {
visited.insert("x\(r)y\(c)")
queue.append((x: r, y: c, count: count + 1)) // 이동 횟수 증가
}
break
}
r = nr
c = nc
}
}
}
return -1
}
'Swift > Swift 알고리즘' 카테고리의 다른 글
[Swift/프로그래머스] 뒤에 있는 큰 수 찾기 ( 그리디 ) (0) | 2024.11.01 |
---|---|
[Swift/프로그래머스] 혼자서 하는 틱택토 ( 완전탐색 ) (0) | 2024.11.01 |
[Swift] DateFormatter (0) | 2024.11.01 |
[Swift/프로그래머스] 과제 진행하기 (?) (0) | 2024.11.01 |
[Swift/프로그래머스] 연속된 부분 수열의 합 (그리디) (0) | 2024.10.31 |