[BOJ] 9205 맥주 마시면서 걸어가기.java

1.문제

2.코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

/**
 * Author : YoungSeo Jeon
 * Date : 2021-09-16
 * Description : 백준 9205
 */


public class Main{
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int T = Integer.parseInt(br.readLine());
		
		for(int tc=0; tc<T; tc++) {
			int n = Integer.parseInt(br.readLine());
			int[][] addr = new int[n+2][2];
			StringTokenizer st;
			//집 주소 입력
			st = new StringTokenizer(br.readLine());
			addr[0][1] = Integer.parseInt(st.nextToken());
			addr[0][0] = Integer.parseInt(st.nextToken());
			
			//편의점 주소 입력
			for(int i=1; i<=n; i++) {
				st = new StringTokenizer(br.readLine());
				addr[i][1] = Integer.parseInt(st.nextToken());
				addr[i][0] = Integer.parseInt(st.nextToken());
			}
			
			//페스티벌 주소 입력
			st = new StringTokenizer(br.readLine());
			addr[n+1][1] = Integer.parseInt(st.nextToken());
			addr[n+1][0] = Integer.parseInt(st.nextToken());
			
			//각 정점간의 거리 
			int[][] leng = new int[n+2][n+2];
			
			for(int i=0; i<n+2; i++) {
				for(int j=0; j<n+2; j++) {
					if(i==j) continue;
					
					leng[i][j] = Math.abs(addr[j][0]-addr[i][0])+Math.abs(addr[j][1]-addr[i][1]);
					
					if(leng[i][j] > 1000) leng[i][j] = 987654321;
				}
			}
			//플로이드-와샬 적용
			for(int k=0; k<n+2; k++) {
				for(int i=0; i<n+2; i++) {
					if(i==k) continue;
					for(int j=0; j<n+2; j++) {
						if(j==i || j==k) continue;
						
						leng[i][j] = Math.min(leng[i][j], leng[i][k]+leng[k][j]);
					}
				}
			}
			if(leng[0][n+1]==987654321) {
				bw.write("sad\n");
			}else {
				bw.write("happy\n");
			}

		}
		bw.flush();
		bw.close();
		br.close();
	}
}

3.Review

걸어갈수있는 거리인 1000을 넘는 거리는 못간다고 가정하고

플로이드 와샬 법칙을 적용하면 풀리는 문제이다.

좋은 웹페이지 즐겨찾기