Java

[백준 2157] 여행 (JAVA)

iheeeee6-6 2023. 7. 11. 11:10
728x90

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

 

2157번: 여행

첫째 줄에 N(1 ≤ N ≤ 300), M(2 ≤ M ≤ N), K(1 ≤ K ≤ 100,000)가 주어진다. K는 개설된 항공로의 개수이다. 다음 K개의 줄에는 각 항공로에 대한 정보를 나타내는 세 정수 a, b, c(1 ≤ a, b ≤ N, 1 ≤ c ≤ 1

www.acmicpc.net

 

DP 문제로 처음에 생각해내기 어려웠다..

 

풀이

1. 리스트 배열을 만들어서 배열의 인덱스는 출발지, 리스트에는 도착지와 점수를 넣는다. ( 만일, 도착지가 출발지보다 작은 수라면 동쪽이동이기 때문에 스킵!)

2. dp 이차원배열을 생성하여 "new int[몇번째로 방문한 것인지=> m+1][도착지 번호=>n+1] = 점수" 를 저장할 것이다. 

3. 큐를 생성하여 출발지를 넣는다.

4. 맨 처음의 출발지는 1이고, 첫번째로 방문한 곳이기에 count=1

5. 큐에 담아 있는 곳들은 모두 같은 방문 번호를 같기에 size를 추출하여 포문을 돌린다.

6. 만일, 출발지로부터 온 점수보다 이미 dp에 저장되어 있는 점수가 더 높을 경우에는 스킵한다.

7. 그렇지 않다면, dp에 해당 값을 저장하고 큐에 해당 도착지를 넣는다.

8. dp[2~m번째로 방문][n]의 최대값을 찾아 출력한다! 끝!

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {

	static int n, m, k;
	static int result=0;
	
	static class Node{
		int idx;
		int point;
		Node(int idx,int point){
			this.idx=idx;
			this.point=point;
		}
	}
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		k = Integer.parseInt(st.nextToken());

		ArrayList<Node>[] map= new ArrayList[n+1];
		for(int i=1;i<=n;i++) {
			map[i]= new ArrayList<>();
		}
		
		for (int i = 0; i < k; i++) {
			st = new StringTokenizer(br.readLine());
			int s = Integer.parseInt(st.nextToken());
			int e = Integer.parseInt(st.nextToken());
			int p = Integer.parseInt(st.nextToken());
			if(e<s) continue;
			map[s].add(new Node(e,p));
		}

		int[][] dp = new int[m+1][n+1];
		Queue<Integer> q = new LinkedList<>();
		q.add(1);
		int count=1;
		while(!q.isEmpty()&&count<m) {
			int size = q.size();
			for(int z=0;z<size;z++) {
				int idx=q.poll();
				for(Node node:map[idx]) {
					if(dp[count][idx]+node.point<=dp[count+1][node.idx]) continue;
					dp[count+1][node.idx]=dp[count][idx]+node.point;
					q.add(node.idx);
				}
			}
			
			count++;
		}
		
		for(int i=2;i<=m;i++) {
			result=Math.max(result, dp[i][n]);
		}
		
		System.out.println(result);
	}
	
}