알고리즘

[백준] 1753번 (java 자바)

changha. 2022. 10. 20. 22:39

내 처음 풀이 [틀림] => 메모리 초과 : 2차원 배열로 인한 듯 하다 

import java.util.*;

public class Main
{
    static final int INF = 3000000;
    static int MAX_N = 20001;
    static int V, E, K;
    static int[][] Graph;
    static int[] Dist = new int[MAX_N];
    
	public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        V = sc.nextInt(); E = sc.nextInt(); K = sc.nextInt();
        Graph = new int[V + 1][V + 1];
        for(int i = 1; i < V; i++){
            for(int j = 1; j < V; j++){
                if(i == j) Graph[i][j] = 0;
                else Graph[i][j] = INF;
            }
        }
        for(int i = 0; i < E; i++){
            int u = sc.nextInt();
            int v = sc.nextInt();
            int w = sc.nextInt();
            Graph[u][v] = w;
        }
        dijkstra(K);
        
        for(int i = 1; i < V + 1; i++){
            if(Dist[i] == INF){
                System.out.println("INF");
            }else System.out.println(Dist[i]);
        }
	}
	static void dijkstra(int src){
	    PriorityQueue<int[]> pq = new PriorityQueue<>((a, b)->a[0] - b[0]);
	    boolean[] visited = new boolean[MAX_N];
	    for(int i = 1; i < V + 1; i++) Dist[i] = INF;
	    Dist[src] = 0;
	    pq.add(new int[] {0, src});
	    while(!pq.isEmpty()){
	        int[] curr = pq.poll();
	        int v = curr[1];
	        if(visited[v]) continue;
	        
	        visited[v] = true;
	        for(int i = 1; i < V; i++){
	            if(Dist[i] > Dist[v] + Graph[v][i]){
	                Dist[i] = Dist[v] + Graph[v][i];
	                pq.add(new int[] {Dist[i], i});
	            }
	        }
	        
	    }
	    
	}
}

 

다른 블로그 참조한 풀이

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

class Node implements Comparable<Node>{
    int end, weight;

    public Node(int end, int weight){
        this.end = end;
        this.weight = weight;
    }

    @Override
    public int compareTo(Node o) {
        return weight - o.weight;
    }
}

public class Main
{   
    private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    private static final int INF = 100_000_000;
    static int v,e,k;
    static List<Node>[] list;
    static int[] dist;
    
	public static void main(String[] args) throws IOException  {
        StringTokenizer st = new StringTokenizer(br.readLine());
        v = Integer.parseInt(st.nextToken());
        e = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(br.readLine());
        list = new ArrayList[v + 1];
        dist = new int[v + 1];

        Arrays.fill(dist, INF);

        for(int i = 1; i <= v; i++){
            list[i] = new ArrayList<>();
        }
        // 리스트에 그래프 정보를 초기화
        for(int i = 0 ; i < e; i++){
            st = new StringTokenizer(br.readLine());
            int start = Integer.parseInt(st.nextToken());
            int end = Integer.parseInt(st.nextToken());
            int weight = Integer.parseInt(st.nextToken());
            // start에서 end로 가는 weight 가중치
            list[start].add(new Node(end, weight));
        }

        StringBuilder sb = new StringBuilder();
        dijkstra(k);
        // 출력 부분
        for(int i = 1; i <= v; i++){
            if(dist[i] == INF) sb.append("INF\n");
            else sb.append(dist[i] + "\n");
        }

        bw.write(sb.toString());
        bw.close();
        br.close();
    
	}
	
	private static void dijkstra(int start){
	    PriorityQueue<Node> queue = new PriorityQueue<>();
	    boolean[] check = new boolean[v+1];
	    queue.add(new Node(start, 0));
	    dist[start] = 0;
	    
	    while(!queue.isEmpty()){
	        Node currNode = queue.poll();
	        int curr = currNode.end;
	        
	        if(check[curr] == true) continue;
	        check[curr] = true;
	        
	        for(Node node : list[curr]){
	            if(dist[node.end] > dist[curr] + node.weight){
	                dist[node.end] = dist[curr] + node.weight;
	                queue.add(new Node(node.end, dist[node.end]));
	            }
	        }
	        
	        
	        
	    }
	    
	    
	}
}

 

 

==> 이차원 배열을 Array 코드로 바꿨더니 통과 됨

 

import java.util.*;

class Node {
    int end, weight;
    
    public Node(int end, int weight){
        this.end = end;
        this.weight = weight;
    }
}

public class Main
{
    static final int INF = 987654321;
    static int MAX_N = 100000;
    static int V, E, K;
    static List<Node>[] Graph;
    static int[] Dist;
    
	public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        V = sc.nextInt(); E = sc.nextInt(); K = sc.nextInt();
        
        Graph = new ArrayList[V + 1];
        Dist = new int[V + 1];
        
        Arrays.fill(Dist, INF);
        
        for(int i = 1; i < V + 1; i++){
            Graph[i] = new ArrayList<>();
        }
        
        for(int i = 0; i < E; i++){
            int u = sc.nextInt();
            int v = sc.nextInt();
            int w = sc.nextInt();
            Graph[u].add(new Node(v, w));
        }
        dijkstra(K);
        
        for(int i = 1; i < V + 1; i++){
            if(Dist[i] == INF){
                System.out.println("INF");
            }else System.out.println(Dist[i]);
        }
	}
	static void dijkstra(int src){
	    PriorityQueue<Node> pq = new PriorityQueue<>((a, b)->a.weight - b.weight);
	    boolean[] visited = new boolean[V + 1];
	    
	    Dist[src] = 0;
	    pq.add(new Node(src, 0));
	    while(!pq.isEmpty()){
	        Node curr = pq.poll();
	        int v = curr.end;
	        if(visited[v]) continue;
	        
	        visited[v] = true;
	        for(Node node : Graph[v]){
	            if(Dist[node.end] > Dist[v] + node.weight){
	                Dist[node.end] = Dist[v] + node.weight;
	                pq.add(new Node (node.end, Dist[node.end]));
	            }
	        }
	        
	    }
	    
	}
}

'알고리즘' 카테고리의 다른 글

[백준] 13549번 (java 자바)  (0) 2022.10.25
[백준] 1916번 (java 자바)  (0) 2022.10.23
다익스트라(Dijkstra) 기본 알고리즘  (0) 2022.10.12
[백준] 1012번(java 자바)  (0) 2022.10.10
[백준] 2667번 (java 자바)  (0) 2022.10.06