Java/코딩테스트
백준 9205 - Java
Bubbles
2023. 6. 29. 13:31
https://www.acmicpc.net/problem/9205
9205번: 맥주 마시면서 걸어가기
송도에 사는 상근이와 친구들은 송도에서 열리는 펜타포트 락 페스티벌에 가려고 한다. 올해는 맥주를 마시면서 걸어가기로 했다. 출발은 상근이네 집에서 하고, 맥주 한 박스를 들고 출발한다.
www.acmicpc.net
집 - 편의점들 - 페스티벌 장소 이렇게 각각의 장소를 posInfo에 저장.
50m에 맥주 하나씩 먹으므로 맨허튼 거리로 계산했을 때 1000까지가 최대 움직일 수 있는 거리이다. 움직일 수 있는 반경에 있는 장소들을 선으로 연결해서 그래프를 만들고, 그 그래프를 탐색했을 때 페스티벌 장소에 도착할 수 있는지에 따라 결과를 출력하면 된다.
DFS 한번 쭉 돈다음에 도착지점을 방문했는지 여부로 출력해도 되고, BFS 돌려도 된다.
import java.io.*;
import java.util.*;
public class Main {
public static ArrayList<Pos> posInfo;
public static ArrayList<Integer>[] roadInfo;
public static boolean[] isVisited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int test = Integer.parseInt(br.readLine());
for (int t = 0; t < test; t++) {
int conv = Integer.parseInt(br.readLine());
posInfo = new ArrayList<>();
roadInfo = new ArrayList[conv+2]; // 각 지점마다 연결 여부 판단
isVisited = new boolean[conv+2];
for (int i = 0; i < conv+2; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
posInfo.add(new Pos(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())));
roadInfo[i] = new ArrayList<>();
}
for (int i = 0; i < posInfo.size(); i++) {
for (int j = i+1; j < posInfo.size(); j++) {
if (dist(posInfo.get(i), posInfo.get(j))) {
roadInfo[i].add(j); // posInfo 리스트 몇번 장소끼리 연결되어있는지 정보를 roadInfo에 저장.
roadInfo[j].add(i);
}
}
}
DFS(0);
if (isVisited[conv+1]) {
System.out.println("happy");
} else {
System.out.println("sad");
}
}
}
public static void DFS (int start) {
isVisited[start] = true;
for (int i : roadInfo[start]) {
if (!isVisited[i]) {
DFS(i);
}
}
}
public static boolean dist (Pos a, Pos b) {
if (Math.abs(a.x - b.x) + Math.abs(a.y - b.y) <= 1000) {
return true;
}
return false;
}
public static class Pos {
int x;
int y;
public Pos (int x, int y) {
this.x = x;
this.y = y;
}
}
}