μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

[ ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / Programmers Level 3 ] GPS

KIMHYEYUN 2021. 9. 28. 16:50
λ°˜μ‘ν˜•

https://programmers.co.kr/learn/courses/30/lessons/1837

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - GPS

edge_list [[1, 2], [1, 3], [2, 3], [2, 4], [3, 4], [3, 5], [4, 6], [5, 6], [5, 7], [6, 7]]

programmers.co.kr

 

문제 μ„€λͺ…


카카였 νƒμ‹œ 개발자 Jay-GλŠ” λ‹€μŒ μ—…λ°μ΄νŠΈλ₯Ό μ€€λΉ„ν•˜κΈ° μœ„ν•΄ κ°œμ„ μ‚¬ν•­μ„ μœ„ν•œ μ—¬λŸ¬ ν”Όλ“œλ°±μ„ λ°›μ•˜λ‹€. κ·Έμ€‘μ—μ„œ μ†λ‹˜μ΄ 자주 νƒ‘μŠΉν•˜λŠ” μœ„μΉ˜λ₯Ό μΆ”μ²œν•΄μ£Όμ—ˆμœΌλ©΄ ν•œλ‹€λŠ” 의견이 λ§Žμ•˜λ‹€.

λ‹€μŒ μ—…λ°μ΄νŠΈ μ€€λΉ„λ₯Ό μœ„ν•΄ Jay-GλŠ” νƒμ‹œμ˜ μŠΉν•˜μ°¨ 및 이동 경둜λ₯Ό μˆ˜μ§‘ν•˜μ—¬ λΆ„μ„ν•˜κΈ° μ‹œμž‘ν•˜μ˜€λ‹€. 데이터λ₯Ό λΆ„μ„ν•˜λ˜ Jay-GλŠ” λͺ‡ κ°€μ§€ νŠΉμ΄μ‚¬ν•­μ„ λ°œκ²¬ν–ˆλ‹€. νƒμ‹œμ˜ 이동 경둜λ₯Ό GPSλ₯Ό 톡해 μˆ˜μ§‘ν•˜κ²Œ λ˜λŠ”λ°, GPS μ‹ ν˜Έ λΆˆλŸ‰, 톡신 였λ₯˜ λ“± λ‹€μ–‘ν•œ μ›μΈμœΌλ‘œ μœ„μΉ˜μ˜ 였λ₯˜κ°€ λ°œμƒν•œ 것을 μ•Œκ²Œ λ˜μ—ˆλ‹€. λ‹€λ§Œ 승차 μœ„μΉ˜μ™€ ν•˜μ°¨ μœ„μΉ˜λŠ” 였λ₯˜κ°€ μ—†λŠ” κ²ƒμœΌλ‘œ 확인이 λ˜μ—ˆλ‹€. 

개발자 Jay-GλŠ” μˆ˜μ§‘ν•œ 이동 경둜의 였λ₯˜λ₯Ό μ΅œμ†Œν•œμœΌλ‘œ μˆ˜μ •ν•˜μ—¬ μ’€ 더 μ •ν™•ν•œ 이동 경둜λ₯Ό κ΅¬ν•˜κ³  μ‹Άμ–΄ ν•œλ‹€.

νƒμ‹œλŠ” λ‹€μŒκ³Ό 같은 쑰건으둜만 μ΄λ™ν•œλ‹€. λ¨Όμ € νƒμ‹œλŠ” 거점을 이동해 λ‹€λ‹ˆλ©°, 거점 κ°„μ˜ 이동은 ν•΄λ‹Ήν•˜λŠ” λ„λ‘œκ°€ μžˆλŠ” κ²½μš°μ—λ§Œ κ°€λŠ₯ν•˜λ‹€. λ˜ν•œ, ꡐ톡 상황에 따라 νƒμ‹œλŠ” ν•œ 거점에 머무λ₯Ό 수 있고, μ™”λ˜ 길을 λ˜λŒμ•„κ°ˆ 수 μžˆλ‹€. λͺ¨λ“  λ„λ‘œλŠ” λ°©ν–₯이 λ³„λ„λ‘œ μ—†λŠ” 왕볡 λ„λ‘œμ΄λ‹€.

예λ₯Ό λ“€μ–΄, μœ„ κ·Έλž˜ν”„μ—μ„œ νƒμ‹œκ°€ λ‹€μŒκ³Ό 같이 μ‹œκ°„λŒ€λ³„λ‘œ 이동 경둜λ₯Ό 보내왔닀. 

t μœ„μΉ˜
1 1
2 2
3 3
4 3
5 6
6 7

ν•˜μ§€λ§Œ μœ„μ˜ νƒμ‹œκ°€ λ³΄λ‚΄μ˜¨ κ²½λ‘œμ—λŠ” κ±°μ  3μ—μ„œ κ±°μ  6으둜 이동할 수 μžˆλŠ” λ„λ‘œκ°€ μ—†μœΌλ―€λ‘œ 이동 κ²½λ‘œμ— 였λ₯˜κ°€ μžˆλ‹€. 

μ΄λŸ¬ν•œ 였λ₯˜λ₯Ό μ΅œμ†Œν•œμœΌλ‘œ μˆ˜μ •ν•˜μ—¬ 이동 κ°€λŠ₯ν•œ 경둜둜 λ§Œλ“€κ³  μ‹Άλ‹€. 이 경우 1회의 였λ₯˜λ₯Ό μˆ˜μ •ν•˜μ—¬ λ‹€μŒκ³Ό 같이 이동 κ°€λŠ₯ν•œ 경둜λ₯Ό λ§Œλ“€ 수 μžˆλ‹€. μ‹œκ°„ t=4의 μœ„μΉ˜λ₯Ό κ±°μ  5둜 ν•œ 번 μˆ˜μ •ν•˜λ©΄ 이동 κ°€λŠ₯ν•œ κ²½λ‘œκ°€ λœλ‹€. 

t μœ„μΉ˜
1 1
2 2
3 3
4 5
5 6
6 7

 

이와 λΉ„μŠ·ν•˜κ²Œ μ‹œκ°„ t=4의 μœ„μΉ˜λ₯Ό κ±°μ  4둜 λ°”κΎΈκ±°λ‚˜, μ‹œκ°„ t=5 μœ„μΉ˜λ₯Ό κ±°μ  5둜 λ°”κΎΈλ©΄ 이동 κ°€λŠ₯ν•œ 경둜둜 λ§Œλ“€ 수 μžˆλ‹€. μœ„μ˜ 경우 μˆ˜μ •ν•œ 였λ₯˜μ˜ κ°œμˆ˜λŠ” 1κ°œμ΄λ‹€. 

t μœ„μΉ˜
1 1
2 2
3 3
4 4
5 6
6 7

 

t μœ„μΉ˜
1 1
2 2
3 3
4 3
5 5
6 7

 

μœ„μ™€ 같이 νƒμ‹œκ°€ λ³΄λ‚΄μ˜¨ κ²½λ‘œμ—μ„œ 이동 κ°€λŠ₯ν•œ 경둜둜 λ§Œλ“œλŠ” μ΅œμ†Œμ˜ 였λ₯˜ μˆ˜μ • 횟수λ₯Ό κ΅¬ν•˜μ—¬λΌ.

 

μž…λ ₯ ν˜•μ‹


μ£Όμ–΄μ§€λŠ” μž…λ ₯은 총 λ‹€μ„― κ°€μ§€λ‘œ, 거점 개수 nκ³Ό λ„λ‘œμ˜ 개수 m, 각 거점 κ°„μ˜ μ—°κ²°λœ λ„λ‘œ 정보 edge_list, νƒμ‹œκ°€ μ‹œκ°„λŒ€λ³„λ‘œ λ³΄λ‚΄μ˜€λŠ” 거점 μ •λ³΄μ˜ 총 개수 k, 그리고 λ¨Έλ¬Όλ €λ˜ 거점의 정보 gps_log이닀. μ œν•œμ‘°κ±΄μ€ μ•„λž˜μ™€ κ°™λ‹€.

  • 2 <= n <= 200
  • 1 <= m <= 10,000
  • 2 <= k <= 100
  • edge_listλŠ” m × 2 ν¬κΈ°μ˜ 2차원 λ°°μ—΄λ‘œ, 각 ν–‰μ˜ 두 값은 λ„λ‘œκ°€ μž‡λŠ” 두 거점의 번호λ₯Ό μ˜λ―Έν•œλ‹€.
  • 거점의 λ²ˆν˜ΈλŠ” 1λΆ€ν„° nκΉŒμ§€ μˆ«μžμ΄λ‹€.
  • λͺ¨λ“  λ„λ‘œλŠ” μ–‘λ°©ν–₯ 톡행이 κ°€λŠ₯ν•˜λ‹€.
  • μž…λ ₯λ˜λŠ” λ°μ΄ν„°μ—μ„œ 항상 λͺ¨λ“  거점 κ°„ κ²½λ‘œκ°€ 있음이 보μž₯λ˜μ§€ μ•ŠλŠ”λ‹€.
  • gps_log의 μ‹œμž‘ 거점과 도착 거점은 λ°”λ€” 수 μ—†λ‹€.

 

좜λ ₯ ν˜•μ‹


이동 κ°€λŠ₯ν•œ 경둜둜 λ§Œλ“€ 수 μžˆλŠ” μ΅œμ†Œμ˜ 였λ₯˜ μˆ˜μ • 횟수λ₯Ό λ¦¬ν„΄ν•œλ‹€. μ˜¬λ°”λ₯Έ 경둜둜 μˆ˜μ •ν•˜λŠ” 것이 λΆˆκ°€λŠ₯ν•  경우 -1을 λ¦¬ν„΄ν•œλ‹€.

 

풀이


아씨....🀦‍♀️

λ„ˆλ¬΄ μ–΄λ €μ›Œμ¨.... κ·Έλž˜μ„œ λ‹€λ₯Έ μ‚¬λžŒλ“€μ˜ μ„€λͺ…을 많이 μ°Έμ‘°ν•΄μ„œ ν•΄κ²°γ„·ν–ˆλ‹€....

λ‚˜μ—κ² λ„ˆλ¬΄ μ–΄λ €μš΄ DPπŸ₯Ά

 

dp[i][j] πŸ‘‰ gps_log의 i 번째 μΈλ±μŠ€μ— j 거점이 μ˜¨λ‹€λ©΄ 0번 μΈλ±μŠ€λΆ€ν„° i 번 μΈλ±μŠ€κΉŒμ§€ 총 λ³€ν•œ μ΅œμ†Œ 수

         1️⃣  j 거점과 μ—°κ²°λœ 거점으둜 μ΄λ™ν•˜λŠ” 경우

         2️⃣ μ΄λ™ν•˜μ§€ μ•ŠλŠ” 경우

 

두 κ°€μ§€ λͺ¨λ‘ ν™•μΈν•΄μ„œ μ΅œμ†Œκ°’μ„ μ°Ύκ³ , 

gps_log [i] κ°€ ν˜„μž¬ 거점 j 와 μΌμΉ˜ν•˜μ§€ μ•ŠμœΌλ©΄ λ°”κΏ”μ€˜μ•Όν•˜λ―€λ‘œ +1 ν•΄μ£Όμ—ˆλ‹€.

 

μ½”λ“œ


import java.util.ArrayList;
import java.util.List;

public class GPS {

    static int INF = 999999999;

    public static int solution(int n, int m, int[][] edge_list, int k, int[] gps_log) {

        List<Integer>[] adj = new List[n+1];
        int[][] dp = new int[k][n+1];

        for(int i = 0 ; i < n+1; i++){
            adj[i] = new ArrayList<>();
        }
        for(int i = 0 ; i < edge_list.length ; i++){
            int o = edge_list[i][0];
            int t = edge_list[i][1];
            adj[o].add(t);
            adj[t].add(o);
        }

        for(int i = 0 ; i < k ; i++){
            for(int j = 0 ; j < n+1 ; j++){
                dp[i][j] = INF;
            }
        }

        // 맨 처음 거점은 μ •ν•΄μ Έ 이씀
        dp[0][gps_log[0]] = 0;

        for(int i = 1 ; i < k ; i++){
            for(int j = 1 ; j < n+1; j++){
                // 이동 x
                dp[i][j] = Math.min(dp[i][j], dp[i-1][j]);

                // μΈμ ‘ν•œ λ…Έλ“œλ‘œ 이동을 ν•˜λŠ” 경우
                for(int next : adj[j]){
                    dp[i][j] = Math.min(dp[i-1][next], dp[i][j]);
                }

                // gps_log[i]와 ν˜„μž¬ 거점이 μΌμΉ˜ν•˜μ§€ μ•ŠμœΌλ©΄ λ³€κ²½λ˜μ—ˆμŒ
                if(j != gps_log[i])
                    dp[i][j]++;
            }
        }

        if(dp[k-1][gps_log[k-1]] < INF)
            return dp[k-1][gps_log[k-1]];

        return -1;
    }

    public static void main(String[] args) {
        int[][] edge_list = {{1,2} , {1,3}, {2,3}, {2,4}, {3,4}, {3,5}, { 4,6}, {5,6} , {5,7}, {6,7}};
        int[] gps_log = {1,2,3,3,6,7};

        System.out.println(solution(7, 10, edge_list, 6, gps_log));
    }

}

 

728x90
λ°˜μ‘ν˜•