728x90
문제
https://www.acmicpc.net/problem/9205
해설
문제에서 상근이는 집에서 맥주 한 박스를 들고 출반한다. 이때 한 박스에는 20개의 맥주가 들어있다.
50미터 당 맥주 한 병을 마시므로 최대 1000미터까지 움직일 수 있고, 이후에는 맥주를 새로 사거나 이미 페스티벌에 도착했어야 한다.
이 문제를 해결하기 위해서는 매허튼 거리를 계속해서 계산해주어야 한다.
맨허튼 거리란 두 좌표 사이의 x 좌표의 차이 + y 좌표의 차이를 뜻한다.
만약 집 위치와 락 페스티벌의 멘허튼 거리가 1000이 안된다면, 맥주 한박스로 페스티벌에 도착할 수 있게 되는 것이다.
하지만 1000이 넘는다면, 중간에 편의점을 들려 맥주를 사야한다.
따라서 집과 편의점의 맨허튼 거리를 구하여 1000이 안된다면, 이 편의점의 위치를 큐에 넣어 위치를 갱신해주며 bfs를 수행해 나가면 된다.
코드
import java.util.*
import kotlin.math.abs
private var homePos = Pair(0, 0)
private lateinit var storePos: Array<Pair<Int, Int>>
private var festivalPos = Pair(0, 0)
private lateinit var visited: BooleanArray
fun main() = with(System.`in`.bufferedReader()) {
val testCase = readLine().toInt()
repeat(testCase) {
val storeCnt = readLine().toInt()
visited = BooleanArray(storeCnt)
val home = readLine().split(" ").map { it.toInt() }
homePos = Pair(home[0], home[1])
storePos = Array(storeCnt) { Pair(0, 0) }
repeat(storeCnt) { i ->
val store = readLine().split(" ").map { it.toInt() }
storePos[i] = Pair(store[0], store[1])
}
val festival = readLine().split(" ").map { it.toInt() }
festivalPos = Pair(festival[0], festival[1])
val possible = move()
if(possible) println("happy")
else println("sad")
}
}
private fun move(): Boolean {
val que: Queue<Pair<Int, Int>> = LinkedList()
que.add(homePos)
while(que.isNotEmpty()) {
val cur = que.poll()
val curX = cur.first
val curY = cur.second
if(manhattan(curX, curY, festivalPos.first, festivalPos.second) <= 1000) return true
else {
for(i in storePos.indices) {
if(manhattan(curX, curY, storePos[i].first, storePos[i].second) <= 1000 && !visited[i]) {
visited[i] = true
que.add(Pair(storePos[i].first, storePos[i].second))
}
}
}
}
return false
}
private fun manhattan(startX: Int, startY: Int, endX: Int, endY: Int): Int
= abs(startX - endX) + abs(startY - endY)
728x90
'PS(Problem Solving) > BOJ' 카테고리의 다른 글
[백준/BOJ] 1926번: 그림 (0) | 2022.10.01 |
---|---|
[백준/BOJ] 1058번: 친구 (1) | 2022.09.25 |
[백준/BOJ] 1325번: 효율적인 해킹 (0) | 2022.09.23 |
[백준/BOJ] 9019번: DSLR (0) | 2022.09.23 |
[백준/BOJ] 5014번: 스타트링크 (0) | 2022.09.22 |
댓글