티스토리 뷰
풀이과정
- 참고 - 다익스트라 알고리즘
- 각각의 마을에서 다른 마을로의 이동시간을 나타내는 grid를 만든다.
이 때 중간에 다른 마을을 거치는 경우는 고려하지 않는다. 문제에서 주어진 예제 1번의 경우에는 아래의 그림과 같이 표현된다.
- 문제 조건에 의해 배달을 출발하는 마을은 1번 마을로 고정되어 있으므로 1번 마을에서 출발하여 1번 마을로 도착하는 경우 걸리는 시간을 0으로 설정한다.
- 1번 마을을 이미 방문했음을 표시한다.
- 아직 방문하지 않은 마을들 중 현재 마을(최초 시작시에는 1번 마을)에서 최단 시간에 이동할 수 있는 마을로 이동한다.
위의 예시에서는 2번과 4번 마을로 이동이 가능하지만 2번 마을이 소요시간 1로 가장 작으므로 2번 마을로 이동하게 된다.- 이동한 마을을 방문했음을 표시한다. 예시에서는 2번 마을을 방문했음을 표시하게 된다.
- 과정 2에서 이동한 현재 마을 (예시에서는 2번 마을)에서 이동할 수 있는 마을들을 모두 찾는다.
- 위 예시의 경우에는 1번, 3번, 5번 마을이 해당된다.
- 각각의 마을에 대해 1번 마을에서 바로 이동하는 경우와, 현재 마을을 거쳐 이동하는 경우 중 소요시간이 작은 쪽을
기록한다. 위의 예시에 대해서는 아래의 그림과 같이 표현된다.
- 1 -> 2 -> 1 이동시간은 1 + 1 = 2 이고, 1 -> 1 이동시간은 0 이므로 값은 그대로 0
- 1 -> 2 -> 3 이동시간은 1 + 3 = 4 이고, 1 -> 3 이동시간은
inf
이므로 3번 마을로의 이동시간을 4로 업데이트한다. - 1 -> 2 -> 5 이동시간은 1 + 2 = 3 이고, 1 -> 5 이동시간은
inf
이므로 5번 마을로의 이동시간을 3으로 업데이트한다.
- 주어진 문제 조건에 의해 임의의 두 마을은 반드시 연결되어 있다 하였으므로, 전체 마을을 모두 방문할 때 까지 과정 2번과 3번을 반복한다. 모든 반복이 종료되면 index가 0인 row에는 1번 마을에서 다른 마을로 도착할 때 까지 소요되는 시간들이 모두 저장되어 있다. 이 값들 중 K 이하인 값들의 수를 세어 반환한다.
Code
import java.util.*;
class Solution {
final int inf = Integer.MAX_VALUE;
public int solution(int N, int[][] roads, int K) {
int[][] towns = new int[N][N];
for (int[] town : towns) {
Arrays.fill(town, inf);
}
towns[0][0] = 0; // 1번 마을은 무조건 배달 가능!
for (int[] road : roads) {
towns[road[0] - 1][road[1] - 1] = Math.min(towns[road[0] - 1][road[1] - 1], road[2]);
towns[road[1] - 1][road[0] - 1] = towns[road[0] - 1][road[1] - 1];
}
Set<Integer> visited = new HashSet<>();
visited.add(0); // starting point
while (visited.size() < N) {
int visitTarget = getNextVisit(towns[0], visited);
visited.add(visitTarget);
int[] visitable = towns[visitTarget];
for (int i = 0; i < visitable.length; i++) {
if (visitable[i] < inf) {
towns[0][i] = Math.min(towns[0][i], towns[0][visitTarget] + visitable[i]);
}
}
}
int count = 0;
for (int i = 0; i < N; i++) {
if (towns[0][i] <= K) {
count++;
}
}
return count;
}
private int getNextVisit(int[] distances, Set<Integer> visited) {
int idx = 0;
int min = inf;
for (int i = 0; i < distances.length; i++) {
if (distances[i] < min && !visited.contains(i)) {
idx = i;
min = distances[i];
}
}
return idx;
}
}
결과
'알고리즘 문제 > Programmers' 카테고리의 다른 글
[프로그래머스] N개의 최소공배수 - Java (0) | 2021.09.11 |
---|---|
[프로그래머스] 오픈채팅방 - Java (0) | 2021.08.16 |
[프로그래머스] 124 나라의 숫자 - Java (0) | 2021.07.03 |
[프로그래머스] 점프와 순간이동 - Java (0) | 2021.06.30 |
[프로그래머스] 멀리 뛰기 - Java (0) | 2021.06.28 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 자바
- java
- 데브코스
- 해시
- stack
- 탐욕법
- Algorithm
- DP
- 자료구조
- 백준
- 프로그래머스
- 멀리 뛰기
- 동적계획법
- programmers
- 힙
- Sorting
- 그래프
- dfs
- BFS
- 정렬
- 완전탐색
- 코딩테스트
- 알고리즘
- Heap
- 큐
- 연습문제
- Hash
- greedy
- Queue
- dynamic programming
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함