일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 분할정복
- 백준
- 코딩테스트
- istringstream
- BFS
- 부주상골수술후기
- dp
- 세브란스
- 독학
- 롯데정보통신
- SWIFT
- 카카오인턴십
- 프로그래머스
- sql
- 카카오인턴
- 부주상골수술
- 리눅스
- 부주상골
- 구현
- c++
- SQLD
- ChatGPT
- 부주상골증후군
- 스택
- DFS
- 독일어독학
- 독일어
- 코테
- IOS
- 카카오코테
Archives
- Today
- Total
슈뢰딩거의 고등어
[프로그래머스] 그래프 > 순위 본문
https://programmers.co.kr/learn/courses/30/lessons/49191
이 문제는 두가지 풀이법이 있다.
1. 플루이드 워셜 알고리즘을 사용
2. 직관적으로 부모노드의 갯수, 자식노드의 개수를 따져서 계산 >> 이 방식으로 하다가 구현이 힘들어져서 플루이드를 사용했다.
일단 플루이드 워셜 방식이다.
#include <string>
#include <vector>
using namespace std;
const int INF = 987654321;
int map[101][101];
int solution(int n, vector<vector<int>> results) {
int answer = 0;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++) {
if(i==j)
map[i][j] = 0;
else
map[i][j] = INF;
}
for(int i=0; i<results.size(); i++) {
int a = results[i][0];
int b = results[i][1];
map[a][b] = 1;
}
for(int k=1; k<=n; k++) {
for(int a=1; a<=n; a++)
for(int b=1; b<=n; b++) {
map[a][b] = min(map[a][b], map[a][k] + map[k][b]);
}
}
/*************** 여기까지는 일반적인 플루이드 워셜 방식이다. **********/
/*************** 여기에서 고정된 순위를 확인해보자 ********/
for(int b=1; b<=n; b++) {
int cnt = 0;
for(int a=1; a<=n; a++) {
if(map[a][b] == INF) {
if(map[b][a] != INF)
cnt++;
else
break;
}
else
cnt++;
}
if(cnt == n)
answer++;
}
return answer;
}
1 | 2 | 3 | 4 | 5 | |
1 | 0 | 1 | INF | INF | 2 |
2 | INF | 0 | INF | INF | 1 |
3 | INF | 1 | 0 | INF | 2 |
4 | INF | 1 | 1 | 0 | 2 |
5 | INF | INF | INF | INF | 0 |
플루이드 워셜 결과 나온 테이블이다.
순위가 정해져있다는 것은 모든 노드들과의 관계를 확인할 수 있다는 것을 의미한다.
따라서, 우리는 특정노드들이 본인을 제외한 노드들과의 관계를 확인할 수 있는지 확인한 후 가능하다면, answer ++ 를 해주면 된다.
위의 노란색은 2번 노드가 1, 2, 3, 4, 5 의 노드들 모두와 관계를 정의할 수 있다는 것을 확인하는 방식이다.
마찬가지로, 5번의 노드 같은 경우에는
1 | 2 | 3 | 4 | 5 | |
1 | 0 | 1 | INF | INF | 2 |
2 | INF | 0 | INF | INF | 1 |
3 | INF | 1 | 0 | INF | 2 |
4 | INF | 1 | 1 | 0 | 2 |
5 | INF | INF | INF | INF | 0 |
이런식으로 확인이 가능하다.
각 노드들이 관계를 정의할 수 있는 노드의 갯수는
1 : 1개(2번)
2: 5개 (1, 3, 4, 5번)
3: 2개 (2, 4번)
4: 2개(2, 3번)
5 : 5개 (1, 2, 3, 4번)
이다.
'알고리즘' 카테고리의 다른 글
[프로그래머스] 다리를 지나는 트럭 (0) | 2022.02.03 |
---|---|
[백준] 2252 줄 세우기 (위상 정렬, topology sort) (0) | 2022.01.31 |
[백준] 17085 십자가 2개 놓기 (0) | 2022.01.27 |
[백준] 17406 배열 돌리기 4 (0) | 2022.01.25 |
[백준] 17089 세친구 (0) | 2022.01.24 |
Comments