Henu
개발냥발
Henu
전체 방문자
오늘
어제
  • 분류 전체보기 (411)
    • DevOps (52)
      • Kubernetes (19)
      • Docker (14)
      • AWS (3)
      • Nginx (4)
      • Linux (4)
      • ArgoCD (1)
      • CN (2)
      • NATS (0)
      • Git (5)
    • Back-End (30)
      • Django (18)
      • Spring (5)
      • JPA (1)
      • MSA (5)
    • CS (87)
      • SystemSoftware (20)
      • OS (25)
      • Computer Architecture (16)
      • Network (23)
      • Database (2)
    • Lang (21)
      • Java (9)
      • Python (4)
      • C# (8)
    • Life (12)
    • 블록체인 (2)
    • Algorithm (204)
      • BOJ (160)
      • 프로그래머스 (19)
      • LeetCode (4)
      • SWEA (1)
      • 알고리즘 문제 해결 전략 (8)
      • DS, algorithms (7)
      • Checkio (5)
    • IT (2)

블로그 메뉴

  • GitHub
  • 글쓰기
  • 관리자

공지사항

  • Free!

인기 글

태그

  • django
  • 프로그래머스
  • DFS
  • Kubernetes
  • 백트래킹
  • boj
  • 다이나믹 프로그래밍
  • Network
  • docker
  • BFS

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Henu

개발냥발

[프로그래머스 level 3] 가장 먼 노드 (C++)
Algorithm/프로그래머스

[프로그래머스 level 3] 가장 먼 노드 (C++)

2022. 3. 5. 10:51

다익스트라 문제

시작노드는 1번으로 고정되어 있고, 간선 사이의 거리는 항상 1로 고정되어 있다.

 

일반적인 다익스트라 풀이와 거의 동일하다.

하지만 1번 노드에서 가장 멀리 떨어진 노드의 거리가 최댓값으로 갱신될 때마다 답을 1로 초기화 시켜야 한다.

 

ex

우선순위 큐에 1번 노드가 있다.

가장 먼저 2번 노드에 방문하면 1번 노드와의 최대 거리가 1로 갱신이 되고, 가장 멀리 떨어진 노드의 수는 1이 된다.

그리고 3번 노드에 방문하면 1번 노드와의 거리가 1이므로 현재 최댓값인 1과 동일하다. 따라서 가장 멀리 떨어진 노드의 수는 2로 갱신이 된다.

동일한 방법으로 4, 5, 6번 노드에 방문하면 최대 거리가 2로 갱신이 되고, 가장 멀리 떨어진 노드의 수는 3이 될 것이다.

 

 

최종 코드

#include <string>
#include <vector>
#include <queue>
#include <iostream>

#define pii pair<int, int>
#define INF 1e9+7

using namespace std;

vector<int> adj[20001];
int dist[20001];
int max_far, ans;

void dijkstra(){
    priority_queue<pii, vector<pii >, greater<pii > > pq;
    pq.push({0, 1});
    
    dist[1] = 0;
    
    while(!pq.empty()){
        int now = pq.top().second;
        int cost = pq.top().first;
        pq.pop();
        
        if(cost > dist[now]) continue;
        if(cost == max_far) ans++;
        else if(cost > max_far){
            max_far = cost;
            ans = 1;
        }
        
        for(int i = 0; i < adj[now].size(); i++){
            int next = adj[now][i];
            int next_cost = cost + 1;
            
            if(next_cost < dist[next]){
                dist[next] = next_cost;
                pq.push({next_cost, next});
            }
        }
    }
}

int solution(int n, vector<vector<int>> edge) {
    
    for(auto ed: edge){
        adj[ed[0]].push_back(ed[1]);
        adj[ed[1]].push_back(ed[0]);
    }
    for(int i = 1; i <= n; i++){
        dist[i] = INF;
    }
    
    dijkstra();
    
    return ans;
}

'Algorithm > 프로그래머스' 카테고리의 다른 글

[프로그래머스 level 3] 네트워크 (C++)  (0) 2022.03.07
[프로그래머스 level 3] 표편집 (C++)  (0) 2022.03.04
[프로그래머스 level 3] 입국심사(C++)  (0) 2022.03.02
[프로그래머스 level 3] 추석 트래픽 (Python)  (2) 2022.02.28
[프로그래머스 level2] 프렌즈4블록 (C++)  (0) 2022.02.22
    'Algorithm/프로그래머스' 카테고리의 다른 글
    • [프로그래머스 level 3] 네트워크 (C++)
    • [프로그래머스 level 3] 표편집 (C++)
    • [프로그래머스 level 3] 입국심사(C++)
    • [프로그래머스 level 3] 추석 트래픽 (Python)

    티스토리툴바