문제
1743번: 음식물 피하기
첫째 줄에 통로의 세로 길이 N(1 ≤ N ≤ 100)과 가로 길이 M(1 ≤ M ≤ 100) 그리고 음식물 쓰레기의 개수 K(1 ≤ K ≤ N×M)이 주어진다. 그리고 다음 K개의 줄에 음식물이 떨어진 좌표 (r, c)가 주어진다
www.acmicpc.net
풀이
입력받은 좌표에 음식물을 표시하고, BFS 탐색을 통해 음식물의 크기를 계산하여 풀이하면 된다.
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, num) = br.readLine().split(' ').map { it.toInt() }
val map = Array(rows){ BooleanArray(cols) }
repeat(num) {
with(StringTokenizer(br.readLine())) {
map[nextToken().toInt() - 1][nextToken().toInt() - 1] = true
}
}
fun bfs(x: Int, y: Int): Int {
val queue : Queue<Point> = LinkedList()
queue.offer(Point(x, y))
map[x][y] = false
var res = 1
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 || nx >= rows || ny < 0 || ny >= cols) continue
if(!map[nx][ny]) continue
map[nx][ny] = false
queue.add(Point(nx, ny))
res++
}
}
return res
}
var ans = 0
for(i in 0 until rows) {
for(j in 0 until cols) {
if(map[i][j]) {
ans = maxOf(ans, bfs(i, j))
}
}
}
bw.write("$ans")
bw.flush()
bw.close()
br.close()
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[백준] 10826번: 피보나치 수 4 - Kotlin[코틀린] (1) | 2023.12.28 |
---|---|
[백준] 2578번: 빙고 - Kotlin[코틀린] (0) | 2023.12.27 |
[백준] 1965번: 상자넣기 - Kotlin[코틀린] (0) | 2023.12.20 |
[백준] 10451번: 순열 사이클 - Kotlin[코틀린] (0) | 2023.12.19 |
[백준] 1072번: 게임 - Kotlin[코틀린] (0) | 2023.12.19 |