백준 | 7569 토마토 Swift - 그래프

https://www.acmicpc.net/problem/7569

Screenshot 2023-08-24 at 8.46.49 PM.png

 

대표적인 그래프 탐색 문제!!

마지막 토마토가 익는 날까지 최소 며칠이 걸리는지 풀어보는 문제다.ㅋㅋ

 

큐에 익은 토마토 좌표를 넣고,

그 토마토의 상하, 좌우, 위아래까지 확인한 다음

그 토마토가 익은 날짜에 +1을 해서 저장해준다.

그리고 익은 토마토 큐에 넣어주고 또 반복!

 

let temp = readLine()!.split(separator: " ").map({ Int($0)! })
let m = temp[0]
let n = temp[1]
let h = temp[2]
var tomato: [[[Int]]] = Array(repeating: [], count: h)
var visited = Array(repeating: Array(repeating: Array(repeating: false, count: m), count: n), count: h)
var count = 0
var queue = Queue<[Int]>()
var answer = 0
for i in 0..<h {
for _ in 0..<n {
tomato[i].append(readLine()!.split(separator: " ").map({ Int($0)! }))
}
}
let dx = [-1, 1, 0, 0, 0, 0]
let dy = [0, 0, -1, 1, 0, 0]
let dz = [0, 0, 0, 0, -1, 1]
func dfs(_ z: Int, _ y: Int, _ x: Int) {
visited[z][y][x] = true
for i in 0..<6 {
let tempX = x + dx[i]
let tempY = y + dy[i]
let tempZ = z + dz[i]
if tempX >= 0 && tempY >= 0 && tempZ >= 0 && tempX < m && tempY < n && tempZ < h {
if !visited[tempZ][tempY][tempX] && tomato[tempZ][tempY][tempX] == 0 {
tomato[tempZ][tempY][tempX] = tomato[z][y][x] + 1
answer = max(answer, tomato[z][y][x])
queue.enqueue([tempZ, tempY, tempX])
}
}
}
}
func solution() -> Int {
if !Array(tomato.joined().joined()).contains(0) {
return answer
}
for i in 0..<h {
for j in 0..<n {
for k in 0..<m {
if tomato[i][j][k] > 0 {
queue.enqueue([i, j, k])
}
}
}
}
while queue.frontValue != queue.size {
let current = queue.dequeue()!
let i = current[0]
let j = current[1]
let k = current[2]
if !visited[i][j][k] && tomato[i][j][k] > 0 {
dfs(i, j, k)
}
}
if Array(tomato.joined().joined()).contains(0) {
answer = -1
}
return answer
}
print(solution())

 

 

다른 그래프 탐색 문제들은 2차원 배열을 사용했다면,

여기서는 3차원 배열을 사용하기 때문에 약간 헷갈리는 부분들이 있었다.

범위 설정!!! 꼭 확인해야 함!!

 

문제를 잘 풀었는데도 시간 초과가 나서 확인해보았는데

Swift Array에서 removeFirst()는 O(n)임을 발견ㅠㅠ

 

https://jeong9216.tistory.com/350#swift%EB%A1%9C-queue-%EA%B5%AC%ED%98%84

 

[자료구조] Queue(큐) with Swift

안녕하세요. 개발하는 정주입니다. 오늘은 "Queue"를 정리하였습니다. 포스팅 하단에 Swift로 Queue를 구현하고 dequeue의 시간복잡도 개선, 테스트도 함께 진행했습니다. Queue란? Queue는 Stack과 함께 기

jeong9216.tistory.com

이 블로그에서 Swift로 구현한 Queue를 활용해서 풀 수 있었다!! (감사합니다!)