본문 바로가기
Algorithm/Programmers

GPS - level 4

by y.j 2019. 4. 13.
728x90

해결방법

먼저 점화식을 세워보자!
$$ dp[i][j] = min(dp[i][j], dp[i-1][here] + error) $$
여기서 i는 시간을 의미하고, j는 각 노드를 의미한다. here은 j노드와 연결된 인접노드를 의미한다. dp[i][j]는 이전 시간 인접노드들의 에러들 중 최소를 + error(1 또는 0)을 의미한다.

int dp[110][210]; // 시간과 노드로 구성된 dp
int error = gps_log[i] == j ? 0 : 1; // gps_log[i]와 현재 노드가 같다면 0 아니면 1

초기화 과정이다. adj[i].clear()는 꼭 써주자! 아무래도 프로그래머스는 전역변수도 초기화가 안되는 모양이다.

for(int i=0;i<210;i++) adj[i].clear();
    for(int i = 0; i < 110; ++i)
        for(int j = 0; j < 210; ++j)
            dp[i][j] = INF;
    for(int i = 0; i < edge_list.size(); ++i) {
        int s = edge_list[i][0];
        int e = edge_list[i][1];
        adj[s].push_back(e);
        adj[e].push_back(s);
    }

항상 처음과 마지막은 옳기 때문에 dp[0][처음 gps위치] = 0으로 초기화 시켜준다. 이후에는 i시간 때 모든 노드를 조사하여 몇 번까지 error가 몇 번인지 구하면 된다.

dp[0][gps_log[0]] = 0;
    for(int i = 1; i < k; ++i) {
        for(int j = 1; j <= n; ++j) {
            int error = gps_log[i] == j ? 0 : 1;
            dp[i][j] = min(dp[i][j], dp[i-1][j] + error);
            for(auto here : adj[j])
                dp[i][j] = min(dp[i][j], dp[i-1][here] + error);
        }
    }
answer = dp[k-1][gps_log.back()];

전체코드

#include <vector>
#include <iostream>
using namespace std;
vector<int> adj[210];
int dp[110][210];
const int INF = 987654321;
int solution(int n, int m, vector<vector<int>> edge_list, int k, vector<int> gps_log) {
    int answer = INF;
    for(int i=0;i<210;i++) adj[i].clear();
    for(int i = 0; i < 110; ++i)
        for(int j = 0; j < 210; ++j)
            dp[i][j] = INF;
    for(int i = 0; i < edge_list.size(); ++i) {
        int s = edge_list[i][0];
        int e = edge_list[i][1];
        adj[s].push_back(e);
        adj[e].push_back(s);
    }
    dp[0][gps_log[0]] = 0;
    for(int i = 1; i < k; ++i) {
        for(int j = 1; j <= n; ++j) {
            int error = gps_log[i] == j ? 0 : 1;
            dp[i][j] = min(dp[i][j], dp[i-1][j] + error);
            for(auto here : adj[j])
                dp[i][j] = min(dp[i][j], dp[i-1][here] + error);
        }
    }
    answer = dp[k-1][gps_log.back()];
    if(answer >= INF) answer = -1;
    return answer;
}
728x90

'Algorithm > Programmers' 카테고리의 다른 글

튜브의 소개팅 - level 4  (0) 2019.04.14
서울에서 경산까지 - level 4  (0) 2019.04.14
단체사진 찍기 - Level 4  (0) 2019.04.06
게임 맵 최단거리 - Level 4  (1) 2019.04.06
쿠키 구입 - level 4  (0) 2019.04.05

댓글