-
[알고리즘] 정확한 순위 - K 대회알고리즘 2022. 9. 26. 20:10728x90
1. 문제
생님은 시험을 본 학생 N명의 성적을 분실하고, 성적을 비교한 결과의 일부만 가지고 있다. 학생 N명의 성적은 모두 다른데 다음은 6명의 학생에 대하여 6번만 성적을 비교한 결과다.
- 1번 학생 → 5번 학생
- 3 → 4
- 4 → 2
- 4 → 6
- 5 → 2
- 5 → 4
A번 학생의 성적이 B번 학생보다 낮다면 화살표가 A에서 B를 가리키도록 한다.
위에 제시된 정보를 유추해서 순위를 정확히 알 수 있는 학생도 있고, 알 수 없는 학생도 있다. 정리하면 4번 학생보다 성적이 낮은 학생은 3명이고, 성적이 높은 학생은 2명이므로 4번 학생의 성적 순위를 정확히 알 수 있지만 다른 학생은 정확한 순위를 알 수 없다.
학생들의 성적을 비교한 결과가 주어질 때, 성적 순위를 정확히 알 수 있는 학생은 몇명인지 계산하는 프로그램을 구하시오.입력조건
- 첫째 줄에 학생들의 수 N(2 ≤ N ≤ 500)과 두 학생의 성적을 비교한 횟수 M(2 ≤ M ≤ 10,000)
- 다음 M개의 각 줄에는 두 학생의 성적을 비교한 결과를 나타내는 두 양의 정수 A와 B
2. 접근
1. 두 학생간에 서로서로 비교를 해야하므로 플로이드로 접근
3. 풀이
# 정확한 순위는 학생 a,b를 서로서로 비교를 하는 성적 비교이기에 플로이드이다 import sys input = sys.stdin.readline n, m = map(int, input().split()) INF = int(1e9) graph = [[INF] * (n+1) for _ in range(n+1)] for i in range(m): a, b = map(int, input().split()) graph[a][b] = 1 for a in range(1, n+1): for b in range(1, n+1): if a == b: graph[a][b] = 1 for k in range(1, n+1): for a in range(1, n+1): for b in range(1, n+1): graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b]) res = 0 for i in range(1, n+1): count = 0 for j in range(1, n+1): if graph[i][j] != INF and graph[j][i] != INF: count += 1 if count == n: res += 1 print(res)
'알고리즘' 카테고리의 다른 글
[알고리즘] 프로그래머스 - 배달 (0) 2022.10.02 [알고리즘] 화성탐사 - ACM-ICPC (1) 2022.09.26 [알고리즘] 플로이드 - 이코테 핵심유형 ( 백준 11404 ) (0) 2022.09.26 [알고리즘] 유명 알고리즘 대회 (0) 2022.09.26 [알고리즘] M 기업 코딩테스트 (0) 2022.09.26