문제 풀이/백준

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

27200 2025. 1. 13. 12:25

문제

https://www.acmicpc.net/problem/9205


풀이(29분)

import java.util.*;
import java.io.*;

public class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;

    public static void main(String[] args) throws Exception {
        int t = Integer.parseInt(br.readLine()); // 테스트 케이스 수

        for (int i = 0; i < t; i++) {
            System.out.println(answer());
        }
    }

    public static String answer() throws IOException {
        int storeCount = Integer.parseInt(br.readLine());
        st = new StringTokenizer(br.readLine());
        Point home = new Point(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())); // 집 위치
        ArrayList<Point> stores = new ArrayList<>();
        for (int i = 0; i < storeCount; i++) {
            st = new StringTokenizer(br.readLine());
            stores.add(new Point(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())));
        }
        st = new StringTokenizer(br.readLine());
        Point festival = new Point(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())); // 축제 위치

        return bfs(home, stores, festival) ? "happy" : "sad";
    }

    public static boolean bfs(Point home, ArrayList<Point> stores, Point festival) {
        Queue<Point> queue = new LinkedList<>();
        boolean[] visited = new boolean[stores.size()];
        queue.add(home);

        while (!queue.isEmpty()) {
            Point current = queue.poll();
            if (distance(current, festival) <= 1000) {
                return true; // 축제에 도달 가능
            }

            for (int i = 0; i < stores.size(); i++) {
                if (!visited[i] && distance(current, stores.get(i)) <= 1000) {
                    visited[i] = true;
                    queue.add(stores.get(i)); // 편의점 방문
                }
            }
        }

        return false; // 축제에 도달 불가능
    }

    public static int distance(Point p1, Point p2) {
        return Math.abs(p1.x - p2.x) + Math.abs(p1.y - p2.y);
    }

    static class Point {
        int x, y;

        Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
}

 

리스트에 편의점에 대한 정보를 잘 담아둔 뒤 bfs를 사용하여 문제를 해결하였다.

 

문제 풀이 초반 Collections.sort를 커스텀하여 문제를 해결하려고 하였다. 하지만 이 경우 편의점을 쓸데없이 방문하느라 놓치는 케이스가 있었기에 bfs로 돌려 풀었다.