일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- AOP
- build_test
- 사이드 프로젝트
- aws
- QueryDSL
- template
- redis
- 알고리즘
- rds
- immutable
- EC2
- 토비의 스프링
- JPA
- JUnit
- java
- springboot
- kotlin
- CodeDeploy
- string
- Action
- compiler
- Airflow
- git
- Spring
- Github
- db
- workflow
- mutable
Archives
- Today
- Total
개발 일기
프로그래머스 레벨2 배달 (JAVA) 본문
오랜만에 글을 씁니다.
요즘 프로젝트를 생각하느라 알고리즘은 푸는데
글을 쓸 시간이 없어서 주말에 씁니다!
이번 문제는 프로그래머스 레벨2 배달입니다.
https://programmers.co.kr/learn/courses/30/lessons/12978
코딩테스트 연습 - 배달
5 [[1,2,1],[2,3,3],[5,2,2],[1,4,2],[5,3,1],[5,4,2]] 3 4 6 [[1,2,1],[1,3,2],[2,3,2],[3,4,3],[3,5,2],[3,5,3],[5,6,1]] 4 4
programmers.co.kr
코드는 GitHub 에도 올라가 있습니다.
import java.util.LinkedList;
import java.util.Queue;
class Solution {
public int solution(int N, int[][] road, int K) {
int answer = 0;
boolean[] counts = new boolean[N + 1];
int[] edge = new int[N + 1]; // 거리
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
counts[1] = true;
while (!queue.isEmpty()) {
int x = queue.poll(); // 노드뽑기
for (int i = 0; i < road.length; i++) { // node 예시 노드,노드,거리
if (road[i][0] == x) { //현재 노드와 같은지 검사
int node = road[i][1]; // 연결된 노드를 뽑음
int nodeEdge = road[i][2];
int length = edge[x] + nodeEdge; // 이전노드 + 현재 노드까지 거리
if (length <= edge[node] || edge[node] == 0) {
edge[node] = length;
if(!counts[node] && edge[node] <= K) { // 카운트 된적이 없고 K 보다 같거나 작을때
counts[node] = true;
}
queue.add(node);
}
} else if (road[i][1] == x) { //앞뒤로 검사해줌 , 위랑 반대로 뽑음
int node = road[i][0];
int nodeEdge = road[i][2];
int length = edge[x] + nodeEdge; // 이전노드 + 현재 노드까지 거리
if (length <= edge[node] || edge[node] == 0) {
edge[node] = length;
if(!counts[node] && edge[node] <= K) { // 카운트 된적이 없고 K 보다 같거나 작을때
counts[node] = true;
}
queue.add(node);
}
}
}
}
for(int i=1; i<counts.length; i++) {
if(counts[i]) {
answer++;
}
}
return answer;
}
}
평범하게 BFS로 탐색하는데
이문제는 주의 해야 할 게 있다
일단 기본적으로 탐색이 안되어 있을 때는 무조건 추가를 해주고
탐색이 되어 있을 경우에
현재 노드까지의 걸이가 기존에 탐색된 거리보다 짧다면
재 탐색을 하기 위해 큐에 넣어준다.
기존에 탐색한 거리가 4이고
이번 탐색한게 3일 경우 다시 탐색해주는 거다..
기본적으로 BFS DFS를 알고 있다면..
그렇게 어려운 문제는 아닙니다.
조금만 생각하면 금방 풀 수 있는 문제였습니다.
'알고리즘 > programmers' 카테고리의 다른 글
프로그래머스 레벨2 기능 개발 (JAVA) (0) | 2021.09.08 |
---|---|
프로그래머스 레벨2 예상 대진표 (JAVA) (0) | 2021.08.22 |
프로그래머스 레벨3 가장 먼 노드 (JAVA) (0) | 2021.07.20 |
프로그래머스 레벨2 게임 맵 최단거리 (0) | 2021.07.20 |
프로그래머스 레벨2 피보나치의 수 (JAVA) (0) | 2021.07.20 |