본문 바로가기
C++ 코딩 문제 풀이/프로그래머스

[Programmers] 배달

by 섬댕이 2023. 12. 21.

 

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


 

문제 해결 과정

착안

1번 마을에서부터 시작하여, 1, 2, $\cdots, N$ 번 마을까지의 최단 경로를 모두 구하여 $K$ 시간보다 적게 걸리는 마을의 수를 카운트하여 문제를 해결하기 위해 플로이드-워셜(Floyd-Warshall) 알고리즘을 활용하여 문제를 해결하고자 하였다.

 

구현

$i, j \space (1 \le i, j \le N)$ 번 마을 사이의 최단 경로로 이동할 때의 가중치의 합을 저장할 배열 Towns[$i$][$j$]을 선언하고

  • $i = j$ 인 경우: 0으로 초기화
  • $i != j$인 경우: 적당히 큰 값으로 초기화(간선 정보로 주어지는 값보다 항상 큰 값)

한 다음, 주어지는 간선 정보를 토대로 Towns[$i$][$j$] 배열에 값을 입력하였다. 이때 두 마을 사이의 경로가 2 개 이상 주어질 수 있기 때문에 가장 가까운 경로로 이동하는 경우로 갱신하여 저장하였으며, 이후 삼중 반복문의 형태로 플로이드-워셜 알고리즘을 구현하여 문제를 해결할 수 있었다.

 

[스포 주의] 아래 '더보기'를 누르면 코드가 나오니 주의하세요~

더보기
#include <iostream>
#include <vector>
using namespace std;

int Towns[51][51];

int solution(int N, vector<vector<int>> road, int K)
{
    int answer = 0;

    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= N; j++)
            if (i != j)
                Towns[i][j] = 99999999;
    
    for (vector<int> r : road)
        if (Towns[r[0]][r[1]] > r[2])
        {
            Towns[r[0]][r[1]] = r[2];    
            Towns[r[1]][r[0]] = r[2];
        }
    
    for (int w = 1; w <= N; w++)
        for (int i = 1; i <= N; i++)
            for (int j = 1; j <= N; j++)
            {
                int dist = Towns[i][w] + Towns[w][j];
                if (Towns[i][j] > dist)
                    Towns[i][j] = dist;
            }

    for (int i = 1; i <= N; i++)
        if (Towns[1][i] <= K)
            answer++;
    
    return answer;
}

 

실행 결과

'C++ 코딩 문제 풀이 > 프로그래머스' 카테고리의 다른 글

[Programmers] 최댓값과 최솟값  (0) 2023.12.28
[Programmers] 구명보트  (1) 2023.12.23
[Programmers] 피로도  (0) 2023.12.21
[Programmers] 등굣길  (0) 2023.12.19
[Programmers] 혼자 놀기의 달인  (0) 2023.12.14

댓글