반응형
해당 포스팅의 문제의 출처는 나동빈님의 이것이 취업을 위한 코딩 테스트 교재를 공부하면서 풀이할 때 본인의 사고 과정 흐름과 문제 풀이를 기록하기 위함 입니다.
문제설명
선생님은 시험을 본 학생 N명의 성적을 분실하고, 성적을 비교한 결과의 일부만 가지고 있다. 학생 N명의 성적은 모두 다른데, 다음은 6명의 학생에 대해 6번만 성적을 비교한 결과이다.
- 1번 성적 < 5번 성적
- 3번 성적 < 4번 성적
- 4번 성적 < 2번 성적
- 4번 성적 < 6번 성적
- 5번 성적 < 2번 성적
- 5번 성적 < 4번 성적
A번 학생의 성적이 B번 학생보다 낮다면 화살표가 A -> B로 된다. 이 때, 순위를 정확히 알 수 있는 학생이 있고 없는 학생이 있다. 학생들의 성적이 비교한 결과가 주어질 때, 성적 순위를 정확히 알 수 있는 학생은 모두 몇 명인지 계산하는 프로그램을 작성해라.(문제가 길어 일부 생략하였다)
입력조건
- 첫째 줄에 학생들의 수 N(2 <= N <= 500)과 두 학생의 성적을 비교한 횟수 M(2 <= M <= 10,000)이 주어진다.
- 다음 M개의 각 줄에는 두 학생의 성적을 비교한 결과를 나타내는 두 양의 정수 A, B가 주어진다. 이는 A번 학생의 성적이 B번 학생보다 낮다는 것을 의미한다.
출력조건
- 첫째 줄에 성적 순위를 정확히 알 수 있는 학생이 몇 명인지 출력해라.
사고과정
- 주어진 범위도 500으로 작고 모든 노드 -> 다른 모든 노드까지의 경로를 구하는 문제라서 플로이드 워셜 알고리즘을 떠올렸다.(물론 경로 비용을 계산하는 문제는 아니지만!)
- 플로이드워셜 알고리즘 틀은 잘 구현했는데, A -> B, B -> A로 가는 경로가 존재하는지 동시에 체크하는 방식을 몰라서 풀지 못했다.. 풀이를 보니 무릎을 탁...
- 그리고 한 노드 당 모든 노드에 도달할 수 있는 경우(INF가 아닌 경우)의 수 합이 N과 같을 때, 순위를 판단할 수 있다는 것도 생각해내지 못했다..
풀이(스스로 못 푼 풀이)
import sys
n, m = map(int, input().split())
INF = 1001
graph = [[INF] * (n+1) for _ in range(n+1)]
for a in range(1, n+1):
for b in range(1, n+1):
if a == b:
graph[a][b] = 0
for _ in range(m):
a, b = map(int, input().split())
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])
result = 0
for i in range(1, n+1):
count = 0
for j in range(1, n+1):
# a->b / b->a 경로 존재하는지 동시에 체크하는 방법!
if graph[i][j] != INF or graph[j][i] != INF:
count += 1
if count == n:
result += 1
print(result)
반응형
'알고리즘 삽질장' 카테고리의 다른 글
[이코테] 구현 - 뱀 (0) | 2021.10.10 |
---|---|
[이코테] 그래프 알고리즘 - 탑승구 (0) | 2021.10.07 |
[이코테] 다이나믹프로그래밍 - 정수 삼각형 (0) | 2021.10.07 |
[이코테] 그리디 - 볼링공 고르기 (0) | 2021.10.06 |
[이코테] 이진 탐색 - 공유기 설치 (0) | 2021.10.06 |