Coding Test/백준(Python)
[백준/Python] 2458번(DFS)_키 순서
syunze
2023. 9. 12. 21:01
📌문제 유형
그래프 이론, 그래프 탐색, DFS, 플로이드-워셜 (골드 Lv.4)
📌문제
2458번: 키 순서
1번부터 N번까지 번호가 붙여져 있는 학생들에 대하여 두 학생끼리 키를 비교한 결과의 일부가 주어져 있다. 단, N명의 학생들의 키는 모두 다르다고 가정한다. 예를 들어, 6명의 학생들에 대하여
www.acmicpc.net
📌나의 문제풀이
- 같은 번호 내, 해당 번호보다 키가 작으면 before, 해당 번호보다 키가 크면 after에 넣어서 DFS 실행
n,m = map(int,input().split())
maps = [[[],[]] for _ in range(n+1)] # before, after
for _ in range(m):
a,b = map(int,input().split())
maps[a][1].append(b) # after
maps[b][0].append(a) # before
def dfs(i, j):
for num in maps[i][j]:
if visited[num] == 0:
visited[num] = 1
dfs(num,j)
ans = 0
for i in range(1,n+1):
visited = [0 for _ in range(n+1)]
visited[i] = 1
for j in range(0,2): # before, after
dfs(i, j)
if sum(visited) == n:
ans += 1
print(ans)
📌 다른사람의 문제풀이
- 플로이드 워셜 활용
https://claude-u.tistory.com/339
#288 백준 파이썬 [2458] 키 순서 - 플로이드 와샬
https://www.acmicpc.net/problem/2458 SOLUTION 플로이드 와샬 알고리즘과, pypy 컴파일러로 풀 수 있다. 자신이 갈 수 있는 노드들은 자기보다 작은 사람들이며 자신에게 오는 경로가 있는 노드들은 자기보다
claude-u.tistory.com
import sys
#입력
N, M = map(int, input().split())
height = [[0 for _ in range(N+1)] for _ in range(N+1)]
for _ in range(M):
tall, short = map(int, sys.stdin.readline().split())
height[tall][short] = 1
#플로이드 와샬 알고리즘
for k in range(1, N+1): #경로 for문이 가장 상위 단계여야 누락되지 않는다(k는 학생)
for i in range(1, N+1):
for j in range(1, N+1):
if height[i][j] == 1 or (height[i][k] ==1 and height[k][j] == 1):
height[i][j] = 1 #자신보다 작은 경우
#출력
answer = 0
for i in range(1, N+1):
known_height = 0
for j in range(1, N+1):
known_height += height[i][j] + height[j][i] #자신보다 작은사람과 큰사람의 합
if known_height == N-1: #자신의 키 순서를 알 경우
answer += 1
print(answer)
📌 리뷰
- 플로이드 워셜
- 모든 정점 사이의 최단 경로를 찾는 탐색 알고리즘
- 단방향 그래프일때 사용
- min(maps[i][j], maps[i][k] + maps[k][j])
플로이드-워셜(Floyd-Warshall) 알고리즘 이론과 파이썬 구현
플로이드-워셜(Floyd-Warshall) 알고리즘 플로이드-워셜(Floyd-Warshall) 알고리즘은 모든 정점 사이의 최단 경로를 찾는 탐색 알고리즘입니다. 최단 경로는 길이 순으로 구해집니다. 플로이드 워셜 알고
it-garden.tistory.com
728x90