문제 보기
https://www.acmicpc.net/problem/1446
풀이
DP를 사용해 문제를 풀었다.
지름길과, 이전 칸에서 +1을 하는 것 중 무엇이 빠른지를 계속 비교하였다.
for(int i = 1; i <= D; ++i) {
dp[i] = dp[i - 1] + 1;
for(int j = 0; j < list[i].size(); ++j) {
dp[i] = Math.min(dp[i], dp[list[i].get(j)[0]] + list[i].get(j)[1]);
}
}
핵심 코드는 위와 같다.
list[]은 i까지 도착하기 위한 출발 지점, 걸리는 시간을 담고 있다.
전체 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int D = Integer.parseInt(st.nextToken());
int[] dp = new int[D + 1];
dp[0] = 0;
List<int[]>[] list = new ArrayList[D + 1];
for(int i = 1; i <= D; ++i) {
list[i] = new ArrayList<>();
}
for (int i = 0; i < N; i++) {
String[] line = br.readLine().split(" ");
if(Integer.parseInt(line[1]) > D) continue;
list[Integer.parseInt(line[1])].add(new int[]{Integer.parseInt(line[0]), Integer.parseInt(line[2])});
}
for(int i = 1; i <= D; ++i) {
dp[i] = dp[i - 1] + 1;
for(int j = 0; j < list[i].size(); ++j) {
dp[i] = Math.min(dp[i], dp[list[i].get(j)[0]] + list[i].get(j)[1]);
}
}
bw.write(dp[D] +"");
bw.flush();
bw.close();
}
}
GitHub 링크
'ProblemSolve > 항해99 코테스터디' 카테고리의 다른 글
99클럽 코테 스터디 29일차 TIL (챌린저): [백준][Java] 11657 타임머신 - 골드4 (0) | 2024.11.25 |
---|---|
99클럽 코테 스터디 28일차 TIL (미들러): [백준][Java] 11055 가장 큰 증가하는 부분 수열 - 실버2 (0) | 2024.11.24 |
99클럽 코테 스터디 26일차 TIL (비기너): [백준][Java] 11004 K번째 수 - 실버5 (0) | 2024.11.22 |
99클럽 코테 스터디 25일차 TIL (챌린저): [백준][Java] 2169 로봇 조종하기 - 골드2 (0) | 2024.11.21 |
99클럽 코테 스터디 24일차 TIL (챌린저): [백준][Java] 2437 저울 - 골드2 (1) | 2024.11.20 |