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

2021. 8. 24. 15:49·알고리즘/백준

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

 

🐢 설명

2차원 평면에서 출발지점, 복수의 중간 지점, 목적지가 있을 때 이동사거리 내에 있다면 이동을 하면서 목적지까지 갈 수 있는지 푸는 문제이다.

 

맥주 20개에 하나당 50미터를 갈 수 있고, 편의점에 들릴때마다 충전할 수 있다고 했지만 간단히 말해서 현재 위치에서 다른 점까지의 DIST가 1000이하면 갈 수 있고 아니면 못간다로 받아들이면 된다.

 

따라서 출발점, 도착점, 중간 편의점들을 모두 하나의 리스트에 담고, 출발점을 큐에 넣고 방문처리 후 탐색을 한다.

 

큐에서 점 하나를 뽑고 (처음에는 당연히 출발점이다.) 해당 점에서 방문을 안했고 갈 수 있다면 큐에 넣어준다.

 

이때 큐는 우선순위 큐로 특정 점에서 목적지 점까지의 거리가 가까운 순으로 정렬된다. 따라서 갈 수 있는 점 중 목적지에 가장 가까운 점부터 확인해가면서 목적지로 가게 된다.

 

🐢코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static int T;
    static boolean[] visited;
    static ArrayList<SPOT> spots = new ArrayList<>();
    static PriorityQueue<SPOT> pq;
    static StringBuilder answer = new StringBuilder();

    private static class SPOT {
        int x, y;

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

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        T = Integer.parseInt(br.readLine());

        while (T-- > 0)
        {
            spots.clear();

            int storeCnt = Integer.parseInt(br.readLine());
            for (int i = 0; i < storeCnt + 2; i++) {
                st = new StringTokenizer(br.readLine());
                int x = Integer.parseInt(st.nextToken());
                int y = Integer.parseInt(st.nextToken());
                spots.add(new SPOT(x, y));
            }

            visited = new boolean[storeCnt + 2];
            go();
        }
        System.out.println(answer);
    }

    private static void go() {
        int move = 1000;
        pq = new PriorityQueue<>(Comparator.comparingInt(spot -> hereTolDist(spot, spots.get(spots.size() - 1))));
        pq.add(spots.get(0));
        visited[0] = true;

        while (!pq.isEmpty()) {
            SPOT now = pq.poll();

            if (hereTolDist(now, spots.get(spots.size() - 1)) <= move) {
                answer.append("happy").append("\n");
                return;
            }

            for (int i = 1; i < spots.size(); i++) {
                if (!visited[i]) {
                    if (hereTolDist(now, spots.get(i)) <= move) {
                        visited[i] = true;
                        pq.add(spots.get(i));
                    }
                }
            }
        }
        answer.append("sad").append("\n");
    }

    private static int hereTolDist(SPOT home, SPOT target) {
        return Math.abs(home.x - target.x) + Math.abs(home.y - target.y);
    }
}
🐢 마무리
반응형
저작자표시 (새창열림)

'알고리즘 > 백준' 카테고리의 다른 글

(백준) 미네랄 _ 18500 [java]  (1) 2021.08.29
(백준) 시간관리하기_6068 [java]  (0) 2021.08.25
(백준) 연료채우기_1826 [java]  (1) 2021.08.23
(백준) 컵라면 - 1781 [java]  (0) 2021.08.21
(백준) 최소 환승 경로 - 2021 [java]  (1) 2021.08.18
'알고리즘/백준' 카테고리의 다른 글
  • (백준) 미네랄 _ 18500 [java]
  • (백준) 시간관리하기_6068 [java]
  • (백준) 연료채우기_1826 [java]
  • (백준) 컵라면 - 1781 [java]
구름뭉치
구름뭉치
구름의 개발일기장
    반응형
  • 구름뭉치
    구름 개발일기장
    구름뭉치
  • 전체
    오늘
    어제
    • ALL (287)
      • 프로젝트 (23)
        • 토스페이먼츠 PG 연동 시리즈 (12)
        • JWT 방식 인증&인가 시리즈 (6)
        • 스우미 웹 애플리케이션 프로젝트 (1)
        • 스프링부트 기본 보일러 플레이트 구축 시리즈 (2)
        • 마이크로서비스 아키텍쳐 시리즈 (1)
      • 스프링 (43)
        • 스프링부트 API 설계 정리 (8)
        • 스프링부트 RestAPI 프로젝트 (18)
        • 스프링부트 WebSocket 적용기 (3)
        • 스프링 JPA 정리 시리즈 (5)
        • 스프링 MVC (5)
        • 스프링 배치 (2)
        • 토비의 스프링 정리 (2)
      • 기술 학습 (3)
        • 아파치 카프카 (9)
        • 클린 코드 (4)
        • 디자인 패턴의 아름다움 (2)
        • 모던 자바 인 액션 (7)
        • JVM 스레드 딥다이브 (7)
      • Web (25)
        • 정리글 (20)
        • GraphQL 정리글 (2)
        • Jenkins 정리글 (3)
      • 취업 (6)
      • CS (77)
        • 네트워크 전공 수업 정리 (11)
        • OSI 7계층 정리 (12)
        • 운영체제 정리 (19)
        • 데이터베이스 정리 (5)
        • MySql 정리 (17)
        • GoF의 Design Pattern 정리 (12)
      • 알고리즘 (70)
        • 백준 (56)
        • 프로그래머스 (12)
        • 알고리즘 정리본 (1)
      • 기초 지식 정리 (2)
      • 일상 (8)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    류블라냐
    마우스
    부다페스트
    동유럽
    키보드 손목 받침대
    크로아티아
    마우스 패드
    mx master s3 for mac
    레이저
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
구름뭉치
(백준) 맥주마시면서걸어가기_9205 [java]
상단으로

티스토리툴바