Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 개인 의료비 예측
- 영상제작기
- 포스코 청년
- 포스코 아카데미
- 혼공머신
- 혼공머신러닝딥러닝
- 팀 분석
- Brightics를 이용한 분석
- 모델링
- 직원 이직률
- 캐글
- 데이터 분석
- 데이터분석
- Brigthics
- 삼성 SDS Brigthics
- 브라이틱스
- Brigthics를 이용한 분석
- Brightics
- 삼성SDS Brigthics
- Brigthics Studio
- 추천시스템
- 혼공
- 삼성 SDS
- 삼성SDS Brightics
- Brightics Studio
- 직원 이직여부
- 노코드AI
- 브라이틱스 서포터즈
- 삼성SDS
- 혼공학습단
Archives
- Today
- Total
데이터사이언스 기록기📚
[백준/Python] 2458번(DFS)_키 순서 본문
📌문제 유형
그래프 이론, 그래프 탐색, 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
'Coding Test > 백준(Python)' 카테고리의 다른 글
[백준/Python] 1967번(DFS)_트리의 지름 (0) | 2023.09.22 |
---|---|
[백준/Python] 11559번(BFS)_Puyo Puyo (0) | 2023.09.14 |
[백준/Python] 16938번(브루트포스 알고리즘)_캠프 준비 (0) | 2023.09.12 |
[백준/Python] 7576번(BFS)_토마토 (0) | 2023.09.08 |
[백준/Python] 2116번(구현, 브루트포스)_주사위 쌓기 (0) | 2023.09.05 |
Comments