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

대표적인 그래프 탐색 문제!!
마지막 토마토가 익는 날까지 최소 며칠이 걸리는지 풀어보는 문제다.ㅋㅋ
큐에 익은 토마토 좌표를 넣고,
그 토마토의 상하, 좌우, 위아래까지 확인한 다음
그 토마토가 익은 날짜에 +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를 활용해서 풀 수 있었다!! (감사합니다!)
'공부하자! > 알고리즘' 카테고리의 다른 글
백준 | 9461 파도반 수열 Swift - DP (0) | 2023.07.18 |
---|---|
백준 | 9095 1, 2, 3 더하기 Swift - DP (0) | 2023.07.18 |
LeetCode | 46. Permutations (Medium) - Swift (0) | 2023.07.14 |
백준 21608 상어 초등학교 Swift - 구현 (0) | 2023.06.20 |
백준 1913 달팽이 Swift - 구현 (0) | 2023.05.23 |