프로그래머스 순위 문제 풀이를 진행하였습니다.
문제를 읽으면 아래와 같은 해석이 가능합니다.
n명의 격투선수가 있으며 1번부터 n번까지 순서대로 번호를 부여받습니다.
경기 결과 [A,B]식으로 보여주는데 A선수가 B선수를 이겼다는 뜻입니다.
몇몇 경기 결과가 분실되어 정확하게 순위를 매길 수 없는 선수들도 있습니다.
정확한 순위를 매길 수 있는 선수들의 수를 구해야합니다.
A가 B를 이겼다는 정보만으로는 순위를 매기기에는 힘듭니다.
그래서 A가 B를 이겼다면 B는 A한테 졌다는 말도 되기에 둘을 같이 확인하며 순위를 매길 수 있습니다.
승패 정보들을 2차원 배열에 넣어 저장해둡니다.
두 결과를 비교하여 한 선수의 결과를 예측해낼 수 있습니다.
만약 [2,4], [4,5]일 경우
2번 선수는 4번 선수를 이기며 4번 선수는 5번 선수를 이깁니다.
그렇게 되면 2번 선수도 5번 선수를 이길 수 있게 되므로 [2,5]라는 새로운 결과를 알 수 있게 됩니다.
지는 상황도 위와 같이 비교하며 찾아낼 수 있습니다.
모든 결과를 비교해도 나오지 않는 결과를 가진 선수는 순위를 매길 수 없는 선수입니다.
#include <bits/stdc++.h>
#include <string>
#include <vector>
using namespace std;
int solution(int n, vector<vector<int>> results) {
int answer = 0;
int resultMap[101][101] = {0,};
for(int i = 0; i <= n; i++)
{
for(int j = 0; j <= n; j++)
{
resultMap[i][j] = 0;
}
}
//맵에 승패를 입력해줌
for(vector<int> v : results)
{
resultMap[v[0]][v[1]] = 1;
resultMap[v[1]][v[0]] = -1;
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(i != j)
{
//만약 경기 결과가 있을 경우
if(resultMap[j][i] != 0)
{
int curResult = resultMap[j][i];
for(int k = 1; k <= n; k++)
{
if(resultMap[i][k] == curResult)
{
resultMap[j][k] = curResult;
}
}
}
}
}
}
//경기 결과가 나오지 않은 선수들을 찾아 빼줍니다.
answer = n;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(resultMap[i][j] == 0 && i != j)
{
answer--;
break;
}
}
}
return answer;
}
https://school.programmers.co.kr/learn/courses/30/lessons/49191