데이터사이언스 기록기📚

[백준/Python] 2458번(DFS)_키 순서 본문

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
Comments