문제
9205번: 맥주 마시면서 걸어가기
송도에 사는 상근이와 친구들은 송도에서 열리는 펜타포트 락 페스티벌에 가려고 한다. 올해는 맥주를 마시면서 걸어가기로 했다. 출발은 상근이네 집에서 하고, 맥주 한 박스를 들고 출발한다.
www.acmicpc.net
풀이
문제에서 주어진 집, 편의점, 페스티벌의 좌표를 그래프의 형태로 가공하여 BFS를 활용해 문제를 해결할 수 있다.
상근이는 매 50미터마다 맥주 한 병을 마셔야 하며, 최대 20병의 맥주를 들고 다닐 수 있다. 따라서 시작 위치에서 20 X 50 = 1000미터 이내라면 이동할 수 있는 지점이다. 이를 고려하여 집, 편의점, 페스티벌 장소를 각각의 정점으로 하고 정점 간의 거리가 1000미터 이내에 있으면 도착 가능한 거리라고 간주하여 그래프로 연결할 수 있다.
이후에는 BFS를 이용하여 도착 가능 여부를 확인하면 된다.
코드
import java.util.*
import kotlin.math.*
data class Point(val x: Int, val y: Int)
fun main() {
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
val sb = StringBuilder()
repeat(br.readLine().toInt()) {
val num = br.readLine().toInt()
val list = mutableListOf<Point>()
repeat(num + 2) {
val (x, y) = br.readLine().split(' ').map { it.toInt() }
list.add(Point(x, y))
}
val graph = List(num + 2) { mutableListOf<Int>() }
for(i in 0 until list.size) { // 정점끼리 거리 비교
for(j in i + 1 until list.size) {
val a = list[i]
val b = list[j]
if(abs(a.x-b.x) + abs(a.y-b.y) > 1000) continue // 1000미터 이상이면 연결 불가능
graph[i].add(j)
graph[j].add(i)
}
}
fun bfs(): Boolean {
val queue: Queue<Int> = LinkedList()
val visited = BooleanArray(num+2)
queue.add(0)
visited[0] = true
while (queue.isNotEmpty()) {
val cur = queue.poll()
if(cur == num + 1) return true // 도착
for(next in graph[cur]) {
if(visited[next]) continue
visited[next] = true
queue.add(next)
}
}
return false
}
sb.append(if(bfs()) "happy\n" else "sad\n")
}
bw.write(sb.toString())
bw.flush()
bw.close()
br.close()
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[백준] 1080번: 행렬 - Kotlin[코틀린] (0) | 2024.02.28 |
---|---|
[백준] 1780번: 종이의 개수 - Kotlin[코틀린] (0) | 2024.02.27 |
[백준] 1992번: 쿼드트리 - Kotlin[코틀린] (0) | 2024.02.06 |
[백준] 2630번: 색종이 만들기 - Kotlin[코틀린] (0) | 2024.02.05 |
[백준] 2503번: 숫자 야구 - Kotlin[코틀린] (0) | 2024.01.29 |