코테/프로그래머스
[프로그래머스/Level2] 배달 (JAVA)
imname1am
2024. 3. 24. 23:56
반응형
📖 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
💡 풀이 방식
• 플로이드 와샬
N 크기가 크지 않아서 플로이드 와샬을 사용했다.
i번 마을에서 j번 마을까지 이동 가능한지 확인하기 위해, 1부터 N까지 중간 지점 k의 (i,k)를 연결하는 경로가 존재하고, (k,j)를 연결하는 경로가 존재한다면 i에서 j번 마을로 배달 가능하다.
dp[i][j] = Math.min(dp[i][j], dp[i][k] + dp[k][j])
🔺 코드
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 {
static final int INF = Integer.MAX_VALUE;
public int solution(int N, int[][] road, int K) {
int[][] dp = new int[N+1][N+1];
// dp 초기화
for(int i = 0 ; i <= N ; i++)
Arrays.fill(dp[i], INF);
for(int i = 1 ; i <= N ; i++)
dp[i][i] = 0;
// 입력값 중 더 작은 값으로 갱신
for(int[] r : road) {
dp[r[0]][r[1]] = Math.min(dp[r[0]][r[1]], r[2]);
dp[r[1]][r[0]] = Math.min(dp[r[0]][r[1]], r[2]);;
}
for(int k = 1 ; k <= N ; k++) { // 중간 지점
for(int i = 1 ; i <= N ; i++) { // 출발지
for(int j = 1 ; j <= N ; j++) { // 도착지
if(i == j || j == k || k == i) continue;
if(dp[i][k] != INF && dp[k][j] != INF) { // (i,k)와 (k,j)를 연결 가능한 경우
dp[i][j] = Math.min(dp[i][j], dp[i][k] + dp[k][j]);
}
}
}
}
int answer = 0;
for(int i = 1 ; i <= N ; i++) {
if(dp[1][i] <= K)
answer++;
}
return answer;
}
}
|
cs |
➕ 다른 풀이 방식
다익스트라를 활용한 풀이
[프로그래머스] 배달(Java, 자바)
배달해당 문제는 노드 간의 최단 거리를 구하는 문제이기 때문에 다익스트라 알고리즘을 적용해 문제를 해결했습니다.1\. 양방향 연결로 인접 리스트를 생성했습니다.2\. 최단 거리를 구해야되
velog.io
BFS를 활용한 풀이
(Java) 프로그래머스 - 배달
문제를 읽고 최단거리를 탐색하는 내용이기에 BFS로 해결할 수 있을줄 알았는데 많은 어려움을 겪었다. BFS 코드를 작성하다가 검색을 통해 힌트를 얻었고 다익스트라나 플로이드 와샬을 사용할
rovictory.tistory.com
27분 소요,,
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
반응형