일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- Babel
- codingtest
- React 공식문서
- 고급안내서
- background tab
- hook
- next13 head
- React18
- context
- getUTCDate
- React 18 Nextjs
- Programmers
- notFound()
- react hook
- React 고급안내서
- Nextjs React 18
- RTK Query
- Render Props
- background setttimeout
- React 18
- Nextjs
- background setInterval
- Javascript
- CSS
- react-helmet
- background: url
- react
- React 고급 안내서
- Next13
- React API 참고서
Archives
- Today
- Total
akjfal
[Programmers] 배달 본문
.
// 1 <= N <= 50
// 1 <= road <= 2000
// road : a b c -> a, b 마을 번호 c 걸리는 시간
// 도로는 여러개 가능
// 1 <= K <= 500,000
// 1번 마을에서 K이하 마을 갯수
// 주의할 점 : 0번 index는 사용안된다
// bfs로 하나씩 나아간다
// 최단 거리를 갱신하면서 나아간다 -> 이때 지금까지 왔던 경로를 기록한다.
// 여러 경로를 거쳐서 중복된 곳을 갈 때 최단거리가 갱신된다면 다시 가기
import java.util.PriorityQueue;
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.Arrays;
class Solution {
class Node implements Comparable<Node>{
int now;
int length = 0;
Node(int now, int N, int length){
this.now = now;
this.length = length;
}
public int compareTo(Node a){
return a.length - this.length;
}
}
public int solution(int N, int[][] road, int K) {
int answer = 1;
int roadLength = road.length;
int[][] map = new int[N+1][N+1];
int[] shortLength = new int[N+1];
Arrays.fill(shortLength, Integer.MAX_VALUE);
ArrayList<ArrayList<Integer>> mapLine = new ArrayList<>();
for(int i = 0; i < N+1; i++){
mapLine.add(new ArrayList<>());
}
for(int i = 0; i < roadLength; i++){
int a = road[i][0], b = road[i][1];
int length = road[i][2];
if(a == 1){
if(shortLength[b] == Integer.MAX_VALUE || shortLength[b] > length)
shortLength[b] = length;
}else if(b == 1){
if(shortLength[a] == Integer.MAX_VALUE || shortLength[a] > length)
shortLength[a] = length;
}
// 마을간 거리
if(map[a][b] == 0 || map[a][b] > length){
if(map[a][b] == 0){
mapLine.get(a).add(b);
mapLine.get(b).add(a);
}
map[a][b] = length;
map[b][a] = length;
}
}
PriorityQueue<Node> q = new PriorityQueue<>();
for(int i = 2; i < N+1; i++){
if(shortLength[i] != Integer.MAX_VALUE){
q.add(new Node(i, N, shortLength[i]));
}
}
while(!q.isEmpty()){
Node n = q.poll();
for(int town : mapLine.get(n.now)){
int totalLength = n.length+map[n.now][town];
if(totalLength < shortLength[town] && totalLength <= K){
shortLength[town] = totalLength;
q.add(new Node(town, N, totalLength));
}
}
}
for(int i = 2; i < N+1; i++){
if(shortLength[i] <= K){
answer++;
}
}
return answer;
}
}
신경써줘야 하는 조건들이 있어 문제가 좀 꼬였었다. 다익스트라알고리즘을 알고있다면 쉽게 풀수 있는문제
배운 점 : Queue가아닌 PriorityQueue를 사용하면 더 빠르다.
'알고리즘 > programmers' 카테고리의 다른 글
[Programmers] [1차] 프렌즈4블록 (0) | 2021.06.18 |
---|---|
[Programmers] 영어 끝말잇기 (0) | 2021.06.18 |
[Programmers] 후보키 (0) | 2021.06.18 |
[Programmers] 순위 검색 (0) | 2021.06.17 |
[Programmers] 행렬 테두리 회전하기 (0) | 2021.06.17 |
Comments