본문 바로가기
백준

백준 9205번 : 맥주 마시면서 걸어가기

by Huiyeong 2021. 4. 5.

 문제

www.acmicpc.net/problem/9205

 

9205번: 맥주 마시면서 걸어가기

송도에 사는 상근이와 친구들은 송도에서 열리는 펜타포트 락 페스티벌에 가려고 한다. 올해는 맥주를 마시면서 걸어가기로 했다. 출발은 상근이네 집에서 하고, 맥주 한 박스를 들고 출발한다.

www.acmicpc.net

9205 맥주 마시면서 걸어가기

 

 구현 방법

 플로이드-와샬 알고리즘으로 풀 수도 있지만 너무 어려워,,서 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