문제
풀이
BFS를 활용해 풀이하면 된다. 먼저 입력을 받고 치즈의 총량을 확인해준다. while문 반복을 통해 치즈가 없어 질 때까지 BFS 함수를 실행한다. 공기와 접촉되어 있는 치즈를 확인하기 위해 Queue에 공기를 담아가며 탐색하고 치즈를 만나면 체크해준다. BFS 탐색이 끝나면 체크되어 있는 치즈를 녹여주고 치즈의 총랑에서 빼준다. 모든 치즈가 녹으면 반복문을 종료하고 시간와 마지막으로 남은 치즈를 출력해준다.
코드
import java.util.*
data class Point(val x: Int, val y: Int)
fun main() {
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
val dx = arrayOf(1, 0, -1, 0)
val dy = arrayOf(0, 1, 0, -1)
val (rows, cols) = br.readLine().split(' ').map { it.toInt() }
val map = Array(rows) { IntArray(cols) }
var cheese = 0 // 치즈의 총량
for(i in 0 until rows) {
val st = StringTokenizer(br.readLine())
for(j in 0 until cols) {
map[i][j] = st.nextToken().toInt()
if(map[i][j] == 1) cheese++
}
}
fun meltCheese() { // 치즈 녹이는 함수
for(i in 0 until rows) {
for(j in 0 until cols) {
if(map[i][j] == 2) {
map[i][j] = 0
cheese--
}
}
}
}
fun bfs(p: Point) {
val visited = Array(rows){ BooleanArray(cols) }
val queue : Queue<Point> = LinkedList()
visited[p.x][p.y] = true
queue.offer(p)
while (queue.isNotEmpty()) {
val tmp = queue.poll()
for(i in 0 until 4) {
val nx = tmp.x + dx[i]
val ny = tmp.y + dy[i]
if(nx < 0 || ny < 0 || nx >= rows || ny >= cols) continue
if(visited[nx][ny]) continue
visited[nx][ny] = true
if(map[nx][ny] == 1) {
map[nx][ny] = 2
} else {
queue.add(Point(nx, ny))
}
}
}
}
var time = 0
var leftover = 0
while (cheese!=0) {
time++
bfs(Point(0, 0))
leftover = cheese
meltCheese()
}
bw.write("$time\n$leftover")
bw.flush()
bw.close()
br.close()
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[백준] 1922번: 네트워크 연결 - Kotlin[코틀린] (0) | 2023.11.01 |
---|---|
[백준] 1717번: 집합의 표현 - Kotlin[코틀린] (0) | 2023.10.31 |
[백준] 1871번: 스택 수열 - Kotlin[코틀린] (0) | 2023.10.26 |
[백준] 2164번: 카드2 - Kotlin[코틀린] (0) | 2023.10.25 |
[백준] 2161번: 카드1 - Kotlin[코틀린] (0) | 2023.10.24 |