반응형
문제분석
문제로, 각 마을간의 다리와 이동거리를 주어집니다.
목표 : 1번마을로부터 출발한다고 가정할때, N시간 이하로 배달이 완료되는 지역 개수를 구하시오.
요점은, 정점과 정점 사이의 최소거리를 구하는 알고리즘을 구현하면된다.
그게 바로, 플로이드 와샬 알고리즘이다.
구현은 구글링을하시면 다 나와있습니다.
플로이드 와샬 구현법:
1. 정점의 개수만큼 2차원 배열 생성, 그리고 모든 배열값에 INF 부여 (큰 숫자)
2. 입력으로 받은 정점과 정점사이의 다리를 입력합니다.
3. 3차반복을통해, 정점과 정점사이의 다리의 최소거리를 구합니다.
사실 이 플로이드 와샬 알고리즘은 꽤나 쉽게 구현이 가능합니다.
자세하게 돌아가는 원리를 아는게 힘들다면, 언제 어떨때 써야하는지 알고, 검색하고 적용하는게 중요하다고 봅니다.
문제풀이
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
32
33
34
35
36
37
38
39
40
41
42
|
import java.util.*;
class Solution {
public int solution(int N, int[][] road, int K) {
int answer = 0;
int[][] map =new int[N][N];
//모든 map값의 INF값을 넣는다.(플로이드 와샬 쓰기위해) map[정점][정점]은 0으로초기화
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[0].length; j++) {
if (i == j){
continue;
}
map[i][j] = 500001;
}
}
// 정점과 정점을 연결해주는 맵을 그린다.
for(int[] data:road){
//새로운 다리가 기존에 있던 다리보다 크면 넘긴다. 작으면 갱신한다.
if(map[data[0]-1][data[1]-1]<data[2]){
continue;
}
map[data[0]-1][data[1]-1]=data[2];
map[data[1]-1][data[0]-1]=data[2];
}
//플로이드 와샬 : 정점과 정점 사이의 최소거리를 구해주는 알고리즘
for(int i=0; i<map.length; i++) {
for(int j=0; j<map.length; j++) {
for(int k=0; k<map.length; k++) {
if(map[j][k] > map[j][i] + map[i][k])
map[j][k] = map[j][i] + map[i][k];
}
}
}
// 1번 마을부터 출발하니, map[0]를 순환한다. 시간이 K이하면 answer++
for (int i = 0; i < map[0].length; i++) {
if (map[0][i] <= K)
answer++;
}
return answer;
}
}
|
cs |
반응형
'알고리즘 > 프로그래머스 Level2' 카테고리의 다른 글
[프로그래머스,Java] Level2:다리를 지나는 트럭 (0) | 2021.12.15 |
---|---|
[프로그래머스,Java] Levle2: 위장 (0) | 2021.12.08 |
[프로그래머스,Java] Level2: 괄호 회전하기 (0) | 2021.12.03 |
[프로그래머스,Java] Level2: 예상 대진표 (0) | 2021.12.01 |
[프로그래머스,Java] Level2: 게임 맵 최단거리 (1) | 2021.11.24 |