백준

[백준_14938번] 서강그라운드

빙수빈수 2021. 8. 12. 17:21

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

 

14938번: 서강그라운드

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

www.acmicpc.net

[문제]

 예은이는 요즘 가장 인기가 있는 게임 서강그라운드를 즐기고 있다. 서강그라운드는 여러 지역중 하나의 지역에 낙하산을 타고 낙하하여, 그 지역에 떨어져 있는 아이템들을 이용해 서바이벌을 하는 게임이다. 서강그라운드에서 1등을 하면 보상으로 치킨을 주는데, 예은이는 단 한번도 치킨을 먹을 수가 없었다. 자신이 치킨을 못 먹는 이유는 실력 때문이 아니라 아이템 운이 없어서라고 생각한 예은이는 낙하산에서 떨어질 때 각 지역에 아이템 들이 몇 개 있는지 알려주는 프로그램을 개발을 하였지만 어디로 낙하해야 자신의 수색 범위 내에서 가장 많은 아이템을 얻을 수 있는지 알 수 없었다.

 각 지역은 일정한 길이 l (1 ≤ l ≤ 15)의 길로 다른 지역과 연결되어 있고 이 길은 양방향 통행이 가능하다. 예은이는 낙하한 지역을 중심으로 거리가 수색 범위 m (1 ≤ m ≤ 15) 이내의 모든 지역의 아이템을 습득 가능하다고 할 때, 예은이가 얻을 수 있는 아이템의 최대 개수를 알려주자.

 주어진 필드가 위의 그림과 같고, 예은이의 수색범위가 4라고 하자. ( 원 밖의 숫자는 지역 번호, 안의 숫자는 아이템 수, 선 위의 숫자는 거리를 의미한다) 예은이가 2번 지역에 떨어지게 되면 1번,2번(자기 지역), 3번, 5번 지역에 도달할 수 있다. (4번 지역의 경우 가는 거리가 3 + 5 = 8 > 4(수색범위) 이므로 4번 지역의 아이템을 얻을 수 없다.) 이렇게 되면 예은이는 23개의 아이템을 얻을 수 있고, 이는 위의 필드에서 예은이가 얻을 수 있는 아이템의 최대 개수이다.

 

[입력 조건]

첫째 줄에는 지역의 개수 n (1 ≤ n ≤ 100)과 예은이의 수색범위 m (1 ≤ m ≤ 15), 길의 개수 r (1 ≤ r ≤ 100)이 주어진다.

둘째 줄에는 n개의 숫자가 차례대로  각 구역에 있는 아이템의 수 t (1 ≤ t ≤ 30)를 알려준다.

세 번째 줄부터 r+2번째 줄 까지 길 양 끝에 존재하는 지역의 번호 a, b, 그리고 길의 길이 l (1 ≤ l ≤ 15)가 주어진다.

 

[코드]

import java.util.*;

public class BaekJoon_14938 {
	static int[][] graph;
	static int[] item;
	static int n,m,r;
	static final int INF=(int)1e9;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		n=sc.nextInt();
		m=sc.nextInt();
		r=sc.nextInt();
		
		// 그래프 초기화
		graph=new int[n+1][n+1];
		for(int i=1;i<=n;i++) {
			for(int j=1;j<=n;j++) {
				if(i==j)
					graph[i][j]=0;
				else 
					graph[i][j]=INF;				
			}
		}
		
		// 아이템 정보 입력받기
		item=new int[n+1];
		for(int i=1;i<=n;i++)
			item[i]=sc.nextInt();
		
		// 연결 상태 입력받기
		for(int i=0;i<r;i++) {
			int a=sc.nextInt();
			int b=sc.nextInt();
			int c=sc.nextInt();
			
			// 양방향 
			graph[a][b]=graph[b][a]=c;
		}
		
		// 플로이드 워셜 알고리즘 수행
		for(int k=1;k<=n;k++) {
			for(int i=1;i<=n;i++) {
				for(int j=1;j<=n;j++) {
					graph[i][j]=Math.min(graph[i][j], graph[i][k]+graph[k][j]);
				}
			}
		}
		
		int max=0,sum;
		// 낙하하는 지역이 1~n 일때 각각 검사
		for(int i=1;i<=n;i++) { 
			sum=0; // 얻을 수 있는 아이템
			/*
			 * 낙하한 지점으로부터 거리가 m 이내이고, 갈 수 있는 지점이라면
			 * 해당 지점의 아이템을 얻을 수 있기 때문에 j 지역 아이템 누적 
			 */
			for(int j=1;j<=n;j++) { 
				if(graph[i][j]<=m&&graph[i][j]!=INF)
					sum+=item[j];
			}
			max=Math.max(max, sum); // 얻을 수 있는 아이템의 최댓값 구하기
		}
		
		System.out.println(max);
	}

}

 

[고찰]

 이번 문제는 모든 지점에서 다른 모든 지점까지의 거리를 알아야 하고, 주어지는 지역이 100개 이하이기 때문에 플로이드 워셜 알고리즘을 사용하여 구현하였다. 이렇게 2차원 배열에 i에서 j로 가는 최단 거리를 구해놓고 2중 for문을 사용하여 완전탐색으로 낙하 지역을 바꿔가며 얻을 수 있는 아이템 수의 최댓값을 구하면 되는 어렵지 않은 문제였다.  

'백준' 카테고리의 다른 글

[백준_5212번] 지구 온난화  (0) 2021.08.12
[백준_11725번] 트리의 부모 찾기  (0) 2021.08.12
[백준_18312번] 시각  (0) 2021.08.12
[백준_19532번] 수학은 비대면강의입니다  (0) 2021.08.12
[백준_20436번] ZOAC 3  (0) 2021.08.12