1916 - Java

고태희·2022년 3월 2일
0

알고리즘

목록 보기
11/15

내풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

	public static void main(String args[]) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		int m = Integer.parseInt(br.readLine());
		
		int[][] arr = new int[n][n];
		StringTokenizer st;
		for (int i = 0; i < m; i++) {
			st = new StringTokenizer(br.readLine());
			int from = Integer.parseInt(st.nextToken()) -1;
			int to = Integer.parseInt(st.nextToken()) -1;
			int w = Integer.parseInt(st.nextToken());
			arr[from][to] = w;
		}
		st = new StringTokenizer(br.readLine());
		int from = Integer.parseInt(st.nextToken()) - 1;
		int to = Integer.parseInt(st.nextToken()) - 1;
		
		int[] dp = new int[n];
		Arrays.fill(dp, Integer.MAX_VALUE);
		dp[from] = 0;
		
		boolean[] visit = new boolean[n];
		
		for (int i = 0; i < n; i++) {
			int min = Integer.MAX_VALUE;
			int current = 0;
			//최소값 찾기
			for (int j = 0; j < n; j++) {
				if(!visit[j] && dp[j] < min) {
					min = dp[j];
					current = j;
				}
			}
			visit[current] = true;
			//경유하면서 최소값 업데이트 해주기
			for (int j = 0; j < n; j++) {
				if(!visit[j] && arr[current][j] != 0 &&
						dp[j] > arr[current][j] + dp[current]) {
					dp[j] = arr[current][j] + dp[current];
				}
			}
		}
		System.out.println(dp[to]);
	}
}

새 풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

	public static void main(String args[]) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		int m = Integer.parseInt(br.readLine());
		
		int[][] arr = new int[n+1][n+1];
		//버스비용이 0일수도 있으니 -1로 초기화
		for (int i = 1; i <= n; i++) {
			Arrays.fill(arr[i], -1);
		}
		
		StringTokenizer st;
		for (int i = 0; i < m; i++) {
			st = new StringTokenizer(br.readLine());
			int from = Integer.parseInt(st.nextToken());
			int to = Integer.parseInt(st.nextToken());
			int w = Integer.parseInt(st.nextToken());

			if(arr[from][to] == -1) arr[from][to] = w;
			else if(arr[from][to] > w) arr[from][to] = w;
		}
		st = new StringTokenizer(br.readLine());
		int start = Integer.parseInt(st.nextToken());
		int end = Integer.parseInt(st.nextToken());
		
		int[] dp = new int[n+1];
		Arrays.fill(dp, Integer.MAX_VALUE);
		dp[start] = 0;
		
		boolean[] visit = new boolean[n+1];
		
		for (int i = 0; i < n; i++) {
			int min = Integer.MAX_VALUE;
			int current = 0;
			//최소값 찾기
			for (int j = 1; j <= n; j++) {
				if(!visit[j] && dp[j] < min) {
					min = dp[j];
					current = j;
				}
			}
			visit[current] = true;
			//경유하면서 최소값 업데이트 해주기
			for (int j = 1; j <= n; j++) {
				if(!visit[j] && arr[current][j] != -1 &&
						dp[j] > arr[current][j] + dp[current]) {
					dp[j] = arr[current][j] + dp[current];
				}
			}
		}
		System.out.println(dp[end]);
	}
}

문제를 풀 때 항상 제약조건을 꼼꼼하게 생각하자고 다짐하게 된 문제

버스의 비용이 0일 수도 있었고,
같은 경로에 대해서 비용이 두번 나오면 최소값으로만 넣어야 했었는데

두가지 상황 모두 생각도 안하고 풀다가 둘다 하나씩 알아내는데 시간 꽤나 많이 잡아먹었다 하..

0개의 댓글

관련 채용 정보