https://school.programmers.co.kr/learn/courses/30/lessons/12978
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
#include <iostream>
#include <vector>
using namespace std;
int solution(int N, vector<vector<int> > road, int K) {
int answer = 0;
vector<vector<int>> dist(N+1,vector<int>(N+1,1e9));
for(auto& item :road)
{
if(dist[item[0]][item[1]]!=1e9)
{
if(dist[item[0]][item[1]]>item[2])
{
dist[item[0]][item[1]]=item[2];
dist[item[1]][item[0]]=item[2];
}
}
else
{
dist[item[0]][item[1]]=item[2];
dist[item[1]][item[0]]=item[2];
}
}
for(int i=1;i<=N;i++)
dist[i][i]=0;
for(int k=1;k<=N;k++)
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
if(dist[i][j]>dist[i][k]+dist[k][j])
dist[i][j]=dist[i][k]+dist[k][j];
for(int i=1;i<=N;i++)
if(dist[1][i]<=K)
answer++;
return answer;
}
주어진 그래프정보를 바탕으로 1번과의 거리가 K 이하인 노드의 개수를 리턴하는 문제이다.
그래프의 모든 경로의 최단경로를 구하느 플로이드-워셜 알고리즘을 사용하여 푼다.
vector<vector<int>> dist(N+1,vector<int>(N+1,1e9));
for(auto& item :road)
{
if(dist[item[0]][item[1]]!=1e9)
{
if(dist[item[0]][item[1]]>item[2])
{
dist[item[0]][item[1]]=item[2];
dist[item[1]][item[0]]=item[2];
}
}
else
{
dist[item[0]][item[1]]=item[2];
dist[item[1]][item[0]]=item[2];
}
}
for(int i=1;i<=N;i++)
dist[i][i]=0;
i -> j 경로에 대해서 여러 정보가 들어올 수 있기 때문에 그 중 최소값을 적용해야 한다.
그리고 i->i는 0으로 초기화한다.
for(int k=1;k<=N;k++)
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
if(dist[i][j]>dist[i][k]+dist[k][j])
dist[i][j]=dist[i][k]+dist[k][j];
for(int i=1;i<=N;i++)
if(dist[1][i]<=K)
answer++;
알고리즘을 실행 후, k보다 작으면 answer를 카운트한다.
'알고리즘 > 프로그래머스 2단계' 카테고리의 다른 글
프로그래머스 - 귤 고르기 - C++ (0) | 2024.09.12 |
---|---|
프로그래머스 - 광물캐기 - C++ (2) | 2024.09.05 |
프로그래머스 - 카카오프렌즈 컬러링 북 - C++ (0) | 2024.08.22 |
프로그래머스 - 가장 큰 수 - C++ (0) | 2024.08.20 |
프로그래머스 - 괄호 변환 - C++ (1) | 2024.08.16 |