codingtest

1446번 - 지름길

2024-03-26
2분 분량
JAVA백준

문제 링크

문제 풀이 시간 : 30분

문제 요약

  • 지름길의 개수 N, 고속도로의 길이 D가 주어진다
  • N은 12 이하인 양의 정수
  • D는 10,000보다 작거나 같은 자연수
  • N개의 지름길의 시작위치, 도착위치, 길이가 주어진다.
  • D까지 이동하기 위한 거리의 최솟값을 구하라

문제 풀이

이 문제는 딱 봐도 다익스트라로 푸는 문제인 것 같다.

C++로는 다익스트라 코드를 많이 짜봤으나

자바로는 한번도 안짜본 것 같아서 이 문제를 선정했다.

근데

이 문제의 조건을 보니 굳이.. 다익스트라로 풀어야 하나 라는 생각이 나의 뇌를 지배했다.

그래서 나온 코드는

정답 코드

java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main {
    public static int n,d,ans;
    public static int[][] input;

    public static void find(int sum,int road){
        if(road==d){
            ans = Math.min(sum,ans);
        }
        if(road>=d)
            return;
        for(int i=0;i<n;i++){
            find(sum+d-road,d);
            if(input[i][0]>=road){
                find(sum+input[i][2]+input[i][0]-road,input[i][1]);
            }
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        d = Integer.parseInt(st.nextToken());
        input=new int[n][3];
        for(int i=0;i<n;i++){
            st=new StringTokenizer(br.readLine());
            input[i][0]=Integer.parseInt(st.nextToken());
            input[i][1]=Integer.parseInt(st.nextToken());
            input[i][2]=Integer.parseInt(st.nextToken());
        }
        ans=d;
        for(int i=0;i<n;i++){
            if(input[i][0]<=d)
                find(input[i][0],input[i][0]);
        }
        System.out.println(ans);
    }
}

다른 코드

java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.Buffer;
import java.util.*;

public class Main {
    static class node {
        int next;
        int dist;

        public node(int next, int dist) {
            this.next = next;
            this.dist = dist;
        }
    }

    static int n, d;
    static ArrayList<ArrayList<node>> arr;
    static int[] ans;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        n = Integer.parseInt(st.nextToken());
        d = Integer.parseInt(st.nextToken());
        ans = new int[d+2];
        arr = new ArrayList<>();
        for (int i = 0; i <= d; i++) {
            arr.add(new ArrayList<>());
            ans[i]=i;
        }

        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            int start = Integer.parseInt(st.nextToken());
            if (start > d)
                continue;
            int dest = Integer.parseInt(st.nextToken());
            int dist = Integer.parseInt(st.nextToken());
            arr.get(start).add(new node(dest, dist));
        }
        find(0);
        System.out.println(ans[d]);
    }

    public static void find(int start) {
        if(start>d)
            return;

        if(ans[start+1]>ans[start]+1)
            ans[start+1]=ans[start]+1;

        for(int i=0;i<arr.get(start).size();i++){
            if(ans[arr.get(start).get(i).next] > ans[start]+arr.get(start).get(i).dist)
                ans[arr.get(start).get(i).next] = ans[start]+arr.get(start).get(i).dist;
        }
        find(start+1);
    }
}

풀고보니 다익스트라가 아니게 됐다.

함께 읽으면 좋은 글

코딩 테스트2026-04-02

5430번 - AC

함수 R은 배열을 뒤집는 연산 함수 D는 첫 번째 원소를 버리는 연산 단, 배열이 비어 있을 때 D를 수행하면 error 주어진 함수 문자열을 순서대로 수행한 뒤 최종 배열을 출력하는 문제 처음에는 문제 설명 그대로 R이 나올 때마다 배열을 실제로 뒤집고, D가 나오면 맨 앞…

코딩 테스트2026-04-02

1966번 - 프린터 큐

여러 문서가 큐에 들어 있고, 각 문서마다 중요도가 있음 맨 앞 문서를 확인했을 때, 더 높은 중요도의 문서가 뒤에 하나라도 있으면 맨 뒤로 보냄 그렇지 않으면 바로 인쇄 특정 위치의 문서가 몇 번째로 인쇄되는지 구하는 문제 이 문제는 프린터의 동작을 그대로 구현하면 되는…

코딩 테스트2026-03-29

1158 - 요세푸스 문제

1번부터 N번까지 사람이 원형으로 앉아 있음 순서대로 K번째 사람을 제거 모든 사람이 제거될 때까지 반복 제거되는 순서를 출력하는 문제 이 문제는 원형으로 순회하면서 K번째를 제거하는 과정을 그대로 구현하면 된다.

코딩 테스트2026-03-29

2164번 - 카드2

1부터 N까지 카드가 순서대로 쌓여 있음 맨 위 카드를 버리고, 그다음 맨 위 카드를 맨 아래로 옮기는 과정을 반복 마지막에 남는 카드 번호를 구하는 문제 이 문제는 규칙을 찾기보다, 문제에서 하라는 과정을 그대로 구현하면 된다. 카드 더미에서 반복되는 동작은 두 가지다.