[백준] 맥주 마시면서 걸어가기 (9205)(kotlin)
문제 설명
입력 및 출력
» 입력
- 첫째 줄에 테스트 케이스의 개수 t가 주어진다. (t ≤ 50) 각 테스트 케이스의 첫째 줄에는 맥주를 파는 편의점의 개수 n이 주어진다. (0 ≤ n ≤ 100). 다음 n+2개 줄에는 상근이네 집, 편의점, 펜타포트 락 페스티벌 좌표가 주어진다. 각 좌표는 두 정수 x와 y로 이루어져 있다. (두 값 모두 미터, -32768 ≤ x, y ≤ 32767) 송도는 직사각형 모양으로 생긴 도시이다. 두 좌표 사이의 거리는 x 좌표의 차이 + y 좌표의 차이 이다. (맨해튼 거리)
» 출력
각 테스트 케이스에 대해서 상근이와 친구들이 행복하게 페스티벌에 갈 수 있으면 “happy”, 중간에 맥주가 바닥나서 더 이동할 수 없으면 “sad”를 출력한다.
예제 입출력(테스트케이스)
입력 | 출력 |
---|---|
2 2 0 0 1000 0 1000 1000 2000 1000 2 0 0 1000 0 2000 1000 2000 2000 |
happy sad |
문제 풀이1
import java.util.LinkedList
import kotlin.math.abs
class Node(val x: Int, val y: Int)
fun main() = with(System.`in`.bufferedReader()) {
repeat(readLine().toInt()) {
var n = readLine().toInt()
var location = Array<Node>(n + 2) {
val (s, d) = readLine().split(" ").map { it.toInt() }
Node(s, d)
}
var success = false
val check = BooleanArray(n + 2)
val q = LinkedList<Node>()
val start = location[0]
val end = location[n + 1]
q.add(start)
while (q.isNotEmpty()) {
val now = q.poll()
if (now.equals(end)) {
success = true
break
}
for (i in 1 until n + 2) {
if (!check[i]) {
if (abs(now.x - location[i].x) + abs(now.y - location[i].y) <= 1000) {
q.add(location[i])
check[i] = true
}
}
}
}
if (success) println("happy")
else println("sad")
}
}