๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/3๋‹จ๊ณ„

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv3] : GPS

by Jaeguk 2022. 7. 8.
๋ฌธ์ œ ๋งํฌ

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

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

๋‹ค์–‘ํ•œ ์›์ธ์œผ๋กœ ์ธํ•ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” GPS๋กœ ํŒŒ์•…ํ•œ ์ง€๋‚˜์˜จ ๊ฑฐ์ ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ,

์ตœ์†Œํ•œ์˜ ๊ฒฝ๋กœ๋งŒ ์ˆ˜์ •ํ•ด์„œ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๊ฐ€ ๋˜๋„๋ก ๋งŒ๋“ค์–ด๋ณด์ž.

 

ํ’€์ด
  • ๋‚ด๊ฐ€ ๋– ์˜ฌ๋ฆฐ ์•„์ด๋””์–ด

์ผ๋‹จ ๋…ธ๋“œ์™€ ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ๋‹น์—ฐํžˆ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์„ ์ด์šฉํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

๋‚˜๋Š” DFS๋ฅผ ์ด์šฉํ•ด์„œ ๊นŠ์ด๊ฐ€ k์ธ ๊ฒฝ๋กœ๋ฅผ ํŒŒ์•…ํ•œ ๋‹ค์Œ, ํƒ์ƒ‰ํ•œ ๊ฒฝ๋กœ์™€ ์ฃผ์–ด์ง„ GPS ๊ฒฝ๋กœ๊ฐ€ ๊ฐ™์•„์ง€๋ ค๋ฉด ๋ช‡ ๊ฐœ์˜ ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•ด์•ผํ•˜๋Š” ์ง€ ํ—ค์•„๋ ธ๋‹ค.

์ด๋•Œ ์ˆ˜์ •ํ•ด์•ผํ•˜๋Š” ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ ์€ ๊ฒƒ์„ ์ •๋‹ต์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ คํ–ˆ๋‹ค.

์ด ๋ฐฉ๋ฒ•์ด ํ‹€๋ฆฐ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋Š” ๋ชจ๋‘ ํ†ต๊ณผํ–ˆ์ง€๋งŒ, ์ฃผ์–ด์ง€๋Š” ๋…ธ๋“œ์™€ ๊ฐ„์„ ์˜ ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ ์ˆ˜๋ก ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋งŽ์•„์ ธ์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ ๋” ๋‚˜์•„๊ฐ€์ง€ ๋ชปํ•˜๊ณ  ํ•œ ์‹œ๊ฐ„ ์ •๋„๋ฅผ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ๊ฒฐ๊ตญ ๊ตฌ๊ธ€์˜ ํž˜์„ ๋นŒ๋ ธ๋‹ค.

3๋‹จ๊ณ„ ๋ฌธ์ œ๊ฐ€ ๋งž๋‚˜ ์‹ถ์„ ์ •๋„๋กœ ์–ด๋ ค์šด ๋ฌธ์ œ์˜€๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ํ’€์–ด๋ณธ ๋ฐ”๋กœ ์นด์นด์˜ค ๋ฌธ์ œ๊ฐ€ ๋Œ€์ฒด๋กœ ์ˆ˜์ค€์ด ๋†’์€ ๋“ฏํ•˜๋‹ค.

 

์ฐธ๊ณ ํ•œ ๋งํฌ

https://ansohxxn.github.io/programmers/130/

 

[C++๋กœ ํ’€์ด] GPS (DP)โญโญโญ

๐Ÿ“Œ GPS

ansohxxn.github.io

๊ณต๋ถ€ํ•˜๋Š” ์‹๋นต๋ง˜๋‹˜์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ํ’€์—ˆ๋‹ค. ์„ค๋ช…์„ ๋„ˆ๋ฌด ์ž˜ํ•ด๋†“์œผ์…”์„œ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

  • ํ’€์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ •๋‹ต์€ DFS, BFS ๋‘˜๋‹ค ์•„๋‹Œ DP์˜€๋‹ค. ๋‚˜๋Š” DP๋ฅผ ์“ธ๊ฑฐ๋ผ๊ณค ์ƒ๊ฐ๋„ ๋ชปํ–ˆ๋Š”๋ฐ ํ’€์ด๋ฅผ ๋ณด๋‹ˆ ์ดํ•ด๊ฐ€๋๋‹ค.

DP[์‹œ๊ฐ„][์œ„์น˜] ๋กœ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ, ํ•ด๋‹น ์‹œ๊ฐ„์— ํ•ด๋‹น ์œ„์น˜๊นŒ์ง€ ์˜ค๊ธฐ์œ„ํ•ด ์ˆ˜์ •ํ•œ ์ตœ์†Œ ํšŸ์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค.

์ตœ์ข…์ ์œผ๋กœ DP[K][๋งˆ์ง€๋ง‰ ์ •์ ] ์— ์ €์žฅ๋˜์–ด์žˆ๋Š” ๊ฐ’์ด ์ •๋‹ต์ด ๋  ๊ฒƒ์ด๋‹ค.

 

DP[ t ][ pos ] ๊ฐ’์„ ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. t - 1 ์ดˆ์—๋„ pos ์œ„์น˜, ์ฆ‰ ๊ฐ™์€ ์œ„์น˜์— ์žˆ์—ˆ๋˜ ๊ฒฝ์šฐ

2. t - 1 ์ดˆ์— ์ธ์ ‘ํ•œ ์œ„์น˜์—์„œ pos๋กœ ์˜จ ๊ฒฝ์šฐ

๋‘ ๊ฒฝ์šฐ ์ค‘์— ์ˆ˜์ •ํšŸ์ˆ˜๊ฐ€ ์ตœ์†Œ๊ฐ€ ๋˜๋Š” ๊ฐ’์„ ์ฐพ๋Š”๋‹ค. ์ด๋•Œ์˜ ๊ฐ’์„ Min์ด๋ผ๊ณ  ํ•˜์ž.

pos๊ฐ€ GPS์— ์ฐํžŒ t์ดˆ์ผ ๋•Œ์˜ ์œ„์น˜์™€ ์ผ์น˜ํ•œ๋‹ค๋ฉด ์ˆ˜์ •์ด ํ•„์š”์—†์œผ๋ฏ€๋กœ

DP[ t ][ pos ] = Min์ด ๋œ๋‹ค

๋งŒ์•ฝ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ˆ˜์ •์ด ํ•„์š”ํ•˜๋ฏ€๋กœ

DP[ t ][ pos ] = Min + 1์ด ๋œ๋‹ค.

์œ„์˜ ๋‚ด์šฉ์„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

int Min = DP[t-1][pos]; //์ œ์ž๋ฆฌ์— ๋จธ๋ฌผ๋ €์„ ๊ฒฝ์šฐ
for(int i = 0; i<Edge[pos].size(); i++)
	Min = min(Min, DP[t-1][Edge[pos][i]]); //์ธ์ ‘ํ•œ ์ •์ ์—์„œ ์™”์„ ๊ฒฝ์šฐ  
if(pos != gps_log[t-1]) //์ฃผ์–ด์ง„ ๊ฒฝ๋กœ์™€ ๋‹ค๋ฅผ ๊ฒฝ์šฐ
	DP[t][pos] = Min + 1; //์ˆ˜์ •ํ•ด์•ผํ•˜๋ฏ€๋กœ + 1
else DP[t][pos] = Min;

 

๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ t๊ฐ€ k๊ฐ€ ๋ ๋•Œ๊นŒ์ง€์˜ DP๊ฐ’์„ ๊ตฌํ•œ ๋’ค,

DP[ k ][ ์ฃผ์–ด์ง„ ๋งˆ์ง€๋ง‰ ์œ„์น˜ ] ๊ฐ€ ์ฒ˜์Œ์— ์ดˆ๊ธฐํ™”ํ•œ ๊ฐ’์ธ INF๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด, ํ•ด๋‹น ์œ„์น˜์—๋Š” ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ answer = - 1์ด ๋œ๋‹ค.

 

k ๋Š” ์ตœ๋Œ€ 100 ์ด๋ฏ€๋กœ ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค๊ณ  ํ•ด๋„ 98ํšŒ์˜ ์ˆ˜์ •์ด ๋ฐœ์ƒํ•œ๋‹ค.

๊ทธ๋ž˜์„œ INF ๊ฐ’์€ 100๋ณด๋‹ค ํฐ ์ˆ˜๋กœ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ฃผ๋ฉด ๋œ๋‹ค.

 

์ฝ”๋“œ ์ž‘์„ฑ
 
#include <bits/stdc++.h>
using namespace std;
const int INF = 1000;
const int MAX_N = 200 + 5;
int solution(int n, int m, vector<vector<int>> edge_list, int k, vector<int> gps_log){
    int answer = 0;
    vector<int> Edge[MAX_N];
    vector<vector<int>> DP(k + 1vector<int>(n + 1, INF));
    for(auto list : edge_list){
        Edge[list[0]].push_back(list[1]);
        Edge[list[1]].push_back(list[0]);
    }
    DP[1][gps_log[0]] = 0//์‹œ์ž‘์ ์€ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€๋Šฅ
    for(int t = 2; t<=k; t++){ //์‹œ๊ฐ„
        for(int pos = 1; pos <= n; pos++){ //๋ชจ๋“  ์ •์  ์ˆœํšŒ
            int Min = DP[t-1][pos]; //์ œ์ž๋ฆฌ์— ๋จธ๋ฌผ๋ €์„ ๊ฒฝ์šฐ
            for(int i = 0; i<Edge[pos].size(); i++)
                Min = min(Min, DP[t-1][Edge[pos][i]]); //์ธ์ ‘ํ•œ ์ •์ ์—์„œ ์™”์„ ๊ฒฝ์šฐ
            
            if(pos != gps_log[t-1]) //์ฃผ์–ด์ง„ ๊ฒฝ๋กœ์™€ ๋‹ค๋ฅผ ๊ฒฝ์šฐ
                DP[t][pos] = Min + 1//์ˆ˜์ •ํ•ด์•ผํ•˜๋ฏ€๋กœ + 1
            else DP[t][pos] = Min;
        }
    }
    
    answer = DP[k][gps_log[k-1]];
    if(answer >= INF)
        answer = -1;
    return answer;
}
cs

 

//์ „์—ญ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์‹œ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๋ผ๋Š” ๊ฒฝ๊ณ ๋ฌธ์ด ์žˆ์—ˆ์ง€๋งŒ ๋ฌด์‹œํ•˜๊ณ  Edge ๋ฒกํ„ฐ๋ฅผ ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ–ˆ๋‹ค๊ฐ€ ๊ณ„์† ํ‹€๋ ธ๋‹ค..

๋„์ €ํžˆ ์–ด๋””๊ฐ€ ํ‹€๋ ธ๋Š”์ง€ ๋ชป์ฐพ๋‹ค๊ฐ€ ํ˜น์‹œ๋‚˜ ํ•ด์„œ ์ง€์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ–ˆ๋”๋‹ˆ ๋งžํ˜”๋‹ค.

๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ํ•˜๋ผ๋Š” ๋Œ€๋กœ ํ•˜์ž.

728x90