728x90
level 3 : 순위
https://programmers.co.kr/learn/courses/30/lessons/49191?language=cpp
코딩테스트 연습 - 순위
5 [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]] 2
programmers.co.kr
코드
//프로그래머스 순위
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int solution(int n, vector<vector<int>> results) {
int answer = 0;
int graph[101][101] = { false, };
for (int i = 0; i < results.size(); i++) {
graph[results[i][0]][results[i][1]] = 1; // graph 생성
}
//floyd warshall
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (graph[i][k] && graph[k][j]) {
graph[i][j] = 1;
}
}
}
}
for (int i = 1; i <= n; i++) {
int count = 0;
for (int j = 1; j <= n; j++) {
if (graph[i][j] || graph[j][i]) { //graph[i][j] : win, graph[j][i] : lose
count++;
}
}
if (count == n - 1) { //자기 자신을 제외한 모든 사람의 우위를 가릴 수 있음
answer++;
}
}
return answer;
}
int main() {
int n = 5;
vector<vector<int>> results = { {4,3}, {4,2}, {3,2}, {1,2}, {2,5} };
cout << solution(n, results) << "\n";
return 0;
}
설명
- 이차원 배원 graph를 생성해서 어떤 선수를 이겼는지 배열에 저장한다.
- floyd warshall를 사용하여 모든 선수에 대해 이겼으면 1을 배열에 저장한다.
- floyd warshall은 가중 그래프에서 최단 경로들을 찾는 알고리즘이다. 모든 노드 간의 최단 경로의 길이를 찾을 수 있다.
- 1번부터 n번까지 우위를 가릴 수 있는 사람이 본인을 제외한 전부라면 정확하게 순위를 매길 수 있다.
고찰
그래프 문제는 쉽게 풀 수 있을 줄 알았지만 그렇지 않았다. 어떻게해야 정확하게 순위를 매길 수 있는 사람의 수를 구할 수 있을지 생각하지 못해서 결국 구글링의 도움으로 문제를 풀 수 있었다.
floyd 알고리즘은 알고는 있었지만 이런 문제에 적용하려니 막막했다...
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
알고리즘(C++) / 프로그래머스 level 3 : 섬 연결하기 (0) | 2021.08.12 |
---|---|
알고리즘(C++) / 프로그래머스 level 3 : 여행경로 (0) | 2021.08.11 |
알고리즘(C++) / 프로그래머스 level 3 : 입국심사 (0) | 2021.08.06 |
알고리즘(C++) / 프로그래머스 level 2 : 후보키 (0) | 2021.08.05 |
알고리즘(C++) / 프로그래머스 level 2 : 파일명 정렬 (0) | 2021.08.04 |
댓글