It's easy, if you try

[백준/boj] 14938: 서강그라운드 (Java) / 플로이드 와샬 본문

알고리즘/자바(Java)

[백준/boj] 14938: 서강그라운드 (Java) / 플로이드 와샬

s5he2 2021. 6. 19. 00:19
반응형

저번에 다익스트라로 풀었던 문제를 플로이드 와샬로 다시 풀어보았다. 아래 링크를 클릭하면 다익스트라 알고리즘 풀이를 확인할 수 있다!

 

[백준/boj] 14938: 서강그라운드 (Java) / 다익스트라 알고리즘

문제 14938번: 서강그라운드 예은이는 요즘 가장 인기가 있는 게임 서강그라운드를 즐기고 있다. 서강그라운드는 여러 지역중 하나의 지역에 낙하산을 타고 낙하하여, 그 지역에 떨어져 있는 아

sohee-dev.tistory.com

 

문제

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

 

14938번: 서강그라운드

예은이는 요즘 가장 인기가 있는 게임 서강그라운드를 즐기고 있다. 서강그라운드는 여러 지역중 하나의 지역에 낙하산을 타고 낙하하여, 그 지역에 떨어져 있는 아이템들을 이용해 서바이벌을

www.acmicpc.net

풀이

import java.util.*;
import java.io.*;

public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int n = Integer.parseInt(st.nextToken()); // 지역의 개수 
		int m = Integer.parseInt(st.nextToken()); // 수색범위
		int r = Integer.parseInt(st.nextToken()); // 길의 개수
		int[] items = new int[n+1];
		int[][] edges = new int[n+1][n+1];
		int MAX_LEN = 16;
		st = new StringTokenizer(br.readLine());
		for(int i=1; i<= n; i++) {
			items[i] = Integer.parseInt(st.nextToken()); // 각 구역에 있는 아이템 수 
		}
	
		for(int i=1; i<=n; i++) {
			for(int j=1; j<=n; j++) {
				edges[i][j] = MAX_LEN;
			}
		}
		
		for(int i=0; i< r; i++) {
			st = new StringTokenizer(br.readLine());
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			int l = Integer.parseInt(st.nextToken()); // 길의 길이
			edges[a][b] = l;
			edges[b][a] = l;
		}
		
		for(int i=1; i<=n; i++) { // 경유지
			for(int j=1; j<=n; j++) { // 출발지
				for(int k=1; k<=n; k++) { // 도착지
					if(i == j || j == k || i == k) continue;
                    // 기존 j부터 k까지 길의 길이보다 i를 경유해서 가는 길의 길이가 더 작다면 갱신한다.
					edges[j][k] = Math.min(edges[j][i] + edges[i][k], edges[j][k]);
				}
			}
		}
		
		int maxNum = 0;
		for(int i=1; i<=n; i++) {
			int temp = items[i];
			for(int j=1; j<=n; j++) {
	            // i에서 j까지 길의 길이가 수색 범위 이내 일때
				if(edges[i][j] <= m) {
					temp += items[j];
				}
			}
			maxNum = Math.max(temp, maxNum);
		}
		
		System.out.println(maxNum);
	}
}

 

반응형
Comments