[백준] 맥주 마시면서 걸어가기 (9205)(kotlin)

문제 설명

백준 9205번 문제 링크

입력 및 출력

» 입력

  • 첫째 줄에 테스트 케이스의 개수 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")
    }
}