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 |
Tags
- java 프로그래머스
- 백준
- 자바 5464
- 백준 18222
- BFS
- 프로그래머스
- 그래프 자바
- 파이썬
- DP
- 카카오
- Java
- 프로그래머스 java
- 스택
- 리트코드 1557
- 인텔리제이 에러
- 리트코드
- daily challenge
- 스프링 에러
- 분할정복
- 코딩테스트
- 자바
- leetcode 1721
- 코테
- 자바 리트코드
- java leetcode
- leetcode
- 리트코드 자바
- dfs
- 백준 16935
- 구현
Archives
- Today
- Total
레벨업 일지
[Java] leetcode 787. Cheapest Flights Within K Stops 본문
문제
https://leetcode.com/problems/cheapest-flights-within-k-stops/description/
최대 k +1 번 움직였을 때 src 부터 dst 까지 최단 거리 구하는 문제
경로가 없으면 -1 리턴.
알아야 할 개념
- BFS 레벨탐색
- 인접 리스트
풀이
로직은 다음과 같다.
- 주어진 정점에 대해 인접 리스트 그래프를 구현한다.
- BFS 레벨 탐색을 진행한다.
- 현재 레벨이 k + 1 을 초과하면 레벨 탐색을 종료하고 dist[ src ] 의 값을 리턴한다.
큐를 사용한 BFS 로 풀이 하였다.
큐에는 [ 방문할 정점, 현재 정점까지의 거리 ] 를 삽입한다. 처음에는 [src, 0 ] 을 넣어주고,
1. 큐에서 모든 원소를 다 빠질 떄까지
2. 레벨이 k + 1 이하 일 떄까지 탐색을 진행한다.
Q.offer(new int[]{src,0});
while 문을 걸어주어 큐에 있는 원소를 탐색한다.
while(!Q.isEmpty() && level < k+1){
int size = Q.size();
for(int i =0 ;i < size;i ++){
int cur[] = Q.poll();//현재 정점 정보를 하나 꺼낸다.
for(int next[] : list.get(cur[0])){//현재 정점에 연결된 인접 리스트를 꺼낸다.
if(cur[1] + next[1] < v[next[0]]){//최단 거리 업데이트 될 때만 큐에 정점 삽입
v[next[0]] = cur[1] +next[1];
Q.offer(new int[]{next[0], v[next[0]]});
}
}
}
level++;//레벨 증가
}
코드
자바
class Solution {
public int findCheapestPrice(int n, int[][] flights, int src, int dst, int k) {
List<List<int[]>> list = new ArrayList<>();
for(int i =0 ;i < n; i++)
list.add(new ArrayList<>());
for(int x[] : flights){
list.get(x[0]).add(new int[]{x[1],x[2]});
}
Queue<int[]> Q =new LinkedList<>();
if(src == dst)return 0;
int[] v = new int[n];
Arrays.fill(v,Integer.MAX_VALUE);
v[src] = 0;
Q.offer(new int[]{src,0});
int level=0;
while(!Q.isEmpty() && level < k+1){
int size = Q.size();
for(int i =0 ;i < size;i ++){
int cur[] = Q.poll();
for(int next[] : list.get(cur[0])){
if(cur[1] + next[1] < v[next[0]]){
v[next[0]] = cur[1] +next[1];
Q.offer(new int[]{next[0], v[next[0]]});
}
}
}
level++;
}
return v[dst] == Integer.MAX_VALUE ? -1 : v[dst];
}
}
'알고리즘 > leetcode' 카테고리의 다른 글
[Java/Python] leetcode 1137. N-th Tribonacci Number (0) | 2023.01.31 |
---|---|
[Java] leetcode 352. Data Stream as Disjoint Intervals (0) | 2023.01.28 |
[Java] leetcode 909. Snakes and Ladders (0) | 2023.01.25 |
[Java] leetcode 815. Bus Routes (2) | 2023.01.23 |
[Java] leetcode 200. Number of Islands (0) | 2023.01.22 |
Comments