Softeer_지우는 소수를 좋아해_java

2023. 6. 16. 11:48Algorithm/Softeer

728x90

https://softeer.ai/practice/info.do?idx=1&eid=582&sw_prbl_sbms_sn=214008

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

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


public class Main
{
    private static List<int[]>[] road;
    private static int minLevel;

    public static void main(String[] args) throws IOException {
        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()); // 길의 수

        minLevel = Integer.MAX_VALUE;
        // 길 정보 입력
        road = new List[N+1];
        for (int i = 1; i<= N; i++){
            road[i] = new ArrayList<>();
        }

        for (int i = 0; i < M; i++){
            st = new StringTokenizer(br.readLine());

            // 체육관 A, B / 필요레벨 C
            int A = Integer.parseInt(st.nextToken());
            int B = Integer.parseInt(st.nextToken());
            int C = Integer.parseInt(st.nextToken());

            road[A].add(new int[]{B, C});
            road[B].add(new int[]{A, C});
        }

        int ans = dijkstra(1, road, N);

        System.out.println(getNextPrime(ans));
    }

    public static int dijkstra(int start, List<int[]>[] road, int N){
        boolean[] visited = new boolean[N+1];
        int[] dist = new int[N+1];

        Arrays.fill(dist, Integer.MAX_VALUE);
        dist[start] = 0;

        PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);
        pq.offer(new int[]{start, 0});

        while (!pq.isEmpty()){
            int[] now = pq.poll();

            if(dist[now[0]] < now[1]) continue;

            for (int[] next : road[now[0]]){
                int nextLevel = Math.max(now[1], next[1]);
                if (dist[next[0]] > nextLevel){
                    dist[next[0]] = nextLevel;
                    pq.offer(new int[]{next[0], dist[next[0]]});
                }
            }
        }
        return dist[N];
    }

    // num ~ 1000000000
    public static int getNextPrime(int num){
        for (int i = num+1; ; i++) {
            if (isPrime(i)) {
                return i;
            }
        }
    }

    public static boolean isPrime(int num){
        for (int i = 2; i<=Math.sqrt(num); i++){
            if (num%i == 0){
                return false;
            }
        }
        return true;
    }
}