문제
9205번: 맥주 마시면서 걸어가기
송도에 사는 상근이와 친구들은 송도에서 열리는 펜타포트 락 페스티벌에 가려고 한다. 올해는 맥주를 마시면서 걸어가기로 했다. 출발은 상근이네 집에서 하고, 맥주 한 박스를 들고 출발한다.
www.acmicpc.net
구현 방법
플로이드-와샬 알고리즘으로 풀 수도 있지만 너무 어려워,,서 bfs로 풀어주었습니다.
처음 시작은 상근이의 집이므로 큐에는 상근이의 집 좌표를 저장, 이동하는 곳으로는 편의점과 락 페스티벌로 입력받은 좌표를 List에 저장하였습니다. 다음 bfs를 돌려 현재 좌표에서 다음 갈 곳의 좌표간의 거리를 구해준 다음 방문을 하지 않았고 맥주가 남아있을 경우에만 큐에 추가해주었습니다. 맥주가 다 떨어지면 방문을 하지 않고 그러다 락 페스티벌에 도착하지 못한 채 모든 방문이 끝나면 sad, 모든 방문이 끝나기 전에 락 페스티벌 좌표에 도착하면 happy를 출력해주었습니다.
구현 코드
package BOJ.Silver;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;
public class BOJ9205_맥주마시면서걸어가기 {
static boolean[] visited;
static List<int[]> list;
static Queue<int[]> queue;
static boolean flag;
static int N;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int TC = Integer.parseInt(br.readLine());
for (int tc=0;tc<TC;tc++) {
N = Integer.parseInt(br.readLine());
visited = new boolean[N+1];
queue = new LinkedList<>();
list = new ArrayList<>();
StringTokenizer st = new StringTokenizer(br.readLine());
int houseX = Integer.parseInt(st.nextToken());
int houseY = Integer.parseInt(st.nextToken());
queue.offer(new int[] {houseX, houseY});
for (int i=0;i<N+1;i++) {
st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
list.add(new int[] {r, c});
}
flag = false;
bfs();
if (flag) sb.append("happy\n");
if (!flag) sb.append("sad\n");
}
System.out.println(sb);
}
static void bfs() {
while(!queue.isEmpty()) {
int[] now = queue.poll();
// 페스티벌에 도착하면 끝
if (now[0]==list.get(list.size()-1)[0] && now[1] == list.get(list.size()-1)[1]) {
flag = true;
break;
}
for (int i=0;i<N+1;i++) {
if (!visited[i]) {
double dis = distance(now[0], now[1], list.get(i)[0], list.get(i)[1]);
if (dis<=1000) { // 맥주가 남아있다!!
queue.offer(new int[] {list.get(i)[0], list.get(i)[1]});
visited[i] = true;
}
}
}
}
}
static double distance(int startX, int endX, int startY, int endY) {
return Math.abs(startY-startX)+Math.abs(endY-endX);
}
}
'백준' 카테고리의 다른 글
백준 14502번 : 연구소 (0) | 2021.04.05 |
---|---|
백준 1600번 : 말이 되고픈 원숭이 (0) | 2021.04.05 |
백준 19236번 : 청소년 상어 (0) | 2021.04.05 |
백준 15683번 : 감시 (0) | 2021.03.24 |
백준 2638번 : 치즈 (0) | 2021.03.24 |