우규이인우윀
Eager To Learn 🌌
우규이인우윀
전체 방문자
였늘
μ–΄μ œ

λΈ”λ‘œκ·Έ 메뉴

  • 🏑 ν™ˆ
  • πŸš€ κΉƒν—ˆλΈŒ
  • β›… νƒœκ·Έ ν΄λΌμš°λ“œ
  • λΆ„λ₯˜ 전체보기 (217)
    • πŸ‘¨πŸ»β€πŸ’» PS (170)
      • JAVA (82)
      • MYSQL (1)
      • Docker (2)
      • PYTHON (24)
      • LeetCode 150 (39)
      • Algorithm 기법 (1)
      • 바킹독 (21)
    • λΈ”λ‘œκ·Έ 이사 (0)
    • Error (1)
    • CS (15)
      • DataBase (2)
      • OS (7)
      • Network (1)
      • Spring (1)
      • 자료ꡬ쑰 (3)
      • Java (1)
    • Learned (7)
      • Spring (7)
    • κ°œλ°œμ„œμ  (15)
      • 가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 (1)
      • 였브젝트 - 쑰영호 (7)
      • μΉœμ ˆν•œ SQL νŠœλ‹ (7)
    • 회고 (2)
hELLO Β· Designed By μ •μƒμš°.
우규이인우윀
πŸ‘¨πŸ»β€πŸ’» PS/바킹독

[JAVA] λ°±μ€€ 13168번 【G3.λ‚΄μΌλ‘œ 여행】

πŸ‘¨πŸ»β€πŸ’» PS/바킹독

[JAVA] λ°±μ€€ 13168번 【G3.λ‚΄μΌλ‘œ 여행】

2023. 10. 11. 12:49

문제

 

13168번: λ‚΄μΌλ‘œ μ—¬ν–‰

첫 번째 μ€„μ—λŠ” ν•œκ΅­μ— μžˆλŠ” λ„μ‹œμ˜ 수 N(1 ≀ N ≀ 100)κ³Ό 1인당 λ‚΄μΌλ‘œ ν‹°μΌ“μ˜ 가격 R(1 ≀ R ≀ 1,000,000)이 μ£Όμ–΄μ§‘λ‹ˆλ‹€. 두 번째 μ€„μ—λŠ” N개의 λ„μ‹œμ˜ 이름이 μ£Όμ–΄μ§‘λ‹ˆλ‹€. λ„μ‹œμ˜ 이름은 μ•ŒνŒŒλ²³ λŒ€μ†Œ

www.acmicpc.net

 

풀이

1️⃣ ν”Œλ‘œμ΄λ“œ μ•Œκ³ λ¦¬μ¦˜κ³Ό ν•΄μ‹œλ₯Ό μ΄μš©ν•œ 풀이

πŸ’‘ λ– μ˜€λ₯Έ Idea

λ¨Όμ €, ν”Œλ‘œμ΄λ“œ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•΄μ„œ λ„μ‹œμ™€ λ„μ‹œκ°„ μ–΄λ–€ 경둜λ₯Ό 거치던 μ΅œμ†Œ λΉ„μš©μ„ ꡬ해야겠닀고 생각이 λ“€μ—ˆλ‹€.

λ‹€λ§Œ, 이 문제의 경우 λ„μ‹œκ°€ μˆ«μžκ°€ μ•„λ‹Œ λ¬Έμžμ—΄μ˜ ν˜•νƒœλ‘œ μ£Όμ–΄μ§€κΈ° λ•Œλ¬Έμ—

λ„μ‹œλ₯Ό κ³ μœ ν•œ 숫자둜 λ³€ν™˜ν•˜μ—¬ ν”Œλ‘œμ΄λ“œ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•΄μ•Όκ² λ‹€λŠ” 생각이 λ“€μ—ˆλ‹€.

1. λ¨Όμ €, μ£Όμ–΄μ§€λŠ” λ„μ‹œμ˜ 쀑볡이 μžˆμ„ 수 μžˆλ‹€κ³  ν–ˆμœΌλ―€λ‘œ 쀑볡을 μ œκ±°ν•œλ‹€.

쀑볡을 μ œκ±°ν•œ λ’€, map을 μ •μ˜ν•˜μ—¬ 각 λ„μ‹œμ˜ 이름을 Key둜 ν•˜κ³  번호λ₯Ό 0λΆ€ν„° λΆ€μ—¬ν•œλ‹€.

2. λ„μ‹œμ™€ λ„μ‹œλ‘œμ˜ κ΅ν†΅μˆ˜λ‹¨ 정보λ₯Ό 받을 λ•Œ, mapμ—μ„œ λ„μ‹œ μ΄λ¦„μœΌλ‘œ λ„μ‹œ 번호λ₯Ό μ–»μ–΄μ˜¬ 수 있게 λœλ‹€.

번호둜 λ³€ν™˜ν•œ λ„μ‹œ 2개λ₯Ό μ΄μš©ν•˜μ—¬ λΉ„μš©μ„ 2차원 λ°°μ—΄ κ·Έλž˜ν”„μ— μž…λ ₯ν•΄μ£Όλ©΄λœλ‹€.

λ‚΄μΌλ‘œ 티켓을 μ‚¬μš©ν•œ λΉ„μš© λ°°μ—΄κ³Ό μ•„λ‹Œ λ°°μ—΄ 2개λ₯Ό μ •μ˜ν•˜μ—¬ λ”°λ‘œ μž…λ ₯ν•΄μ€€λ‹€.

3. λ‚΄μΌλ‘œ 티켓을 μ‚¬μš©ν–ˆλ‹€κ³  κ°€μ •ν•œ λΉ„μš©κ³Ό 일반 λΉ„μš© 2개의 배열을 각각 ν”Œλ‘œμ΄λ“œ μ•Œκ³ λ¦¬μ¦˜μ„ 톡해

각 λ„μ‹œμ—μ„œ λ„μ‹œλ‘œμ˜ μ΅œμ†Œ λΉ„μš© 배열을 κ΅¬ν•œλ‹€.

4. κ³„νšν•œ μ—¬ν–‰ 루트λ₯Ό λ°”νƒ•μœΌλ‘œ 각 경우의 λΉ„μš© 총합을 κ΅¬ν•˜κ³  λΉ„κ΅ν•˜μ—¬ 닡을 λ°˜ν™˜ν•œλ‹€.

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        int numOfCities = Integer.parseInt(input[0]);
        int R = Integer.parseInt(input[1]);
        final int MAX = 10000100;

        // λ„μ‹œ 쀑볡 제거
        String[] places = getPlaces(br.readLine().split(" "));

        // λ„μ‹œ 별 번호 λΆ€μ—¬
        Map<String, Integer> map = new HashMap<>();
        for (int i = 0; i < places.length; i++) {
            map.put(places[i], i);
        }

        // 쀑볡을 μ œκ±°ν•œ λ„μ‹œμ˜ 수
        int N = map.size();

        int M = Integer.parseInt(br.readLine());
        // μ—¬ν–‰ν•  λ„μ‹œ μˆœμ„œ
        String[] trip = br.readLine().split(" ");


        int K = Integer.parseInt(br.readLine());
        // λ‚΄μΌλ‘œ 할인이 적용 μ•ˆλ˜λŠ” λΉ„μš©
        double[][] costs = new double[N][N];
        // λ‚΄μΌλ‘œ 할인이 μ μš©λ˜λŠ” λΉ„μš©
        double[][] costsWithTicket = new double[N][N];

        for (int r = 0; r < N; r++) {
            for (int c = 0; c < N; c++) {
                if (r != c) {
                    costs[r][c] = MAX;
                    costsWithTicket[r][c] = MAX;
                }
            }
        }

        // λ„μ‹œμ—μ„œ λ„μ‹œλ‘œ μ΄λ™ν•˜λŠ” λΉ„μš© μž…λ ₯
        for (int i = 0; i < K; i++) {
            input = br.readLine().split(" ");
            String type = input[0];
            String start = input[1];
            String end = input[2];
            double cost = Double.parseDouble(input[3]);

            // ꡐ톡 μˆ˜λ‹¨μ— λ”°λ₯Έ 할인가 계산
            double costWithTicket = calculatePrice(type, cost);

            int u = map.get(start);
            int v = map.get(end);
            costs[u][v] = Math.min(costs[u][v], cost);
            costs[v][u] = Math.min(costs[v][u], cost);
            costsWithTicket[u][v] = Math.min(costsWithTicket[u][v], costWithTicket);
            costsWithTicket[v][u] = Math.min(costsWithTicket[v][u], costWithTicket);
        }

        // ν”Œλ‘œμ΄λ“œ μ•Œκ³ λ¦¬μ¦˜ μ‚¬μš©
        for (int m = 0; m < N; m++) {
            for (int u = 0; u < N; u++) {
                for (int v = 0; v < N; v++) {
                    costs[u][v] = Math.min(costs[u][v], costs[u][m] + costs[m][v]);
                    costsWithTicket[u][v] = Math.min(costsWithTicket[u][v], costsWithTicket[u][m] + costsWithTicket[m][v]);
                }
            }
        }

        // λ„μ‹œμ—μ„œ λ„μ‹œλ‘œ κ°€λŠ” μ΅œμ†ŒλΉ„μš©μ΄ ν”Œλ‘œμ΄λ“œλ₯Ό 톡해 계산 λ˜μ—ˆμœΌλ―€λ‘œ 총 합을 κ΅¬ν•œλ‹€.
        double sum = 0;
        double sumWithTicket = 0;

        for (int i = 0; i < M - 1; i++) {
            int u = map.get(trip[i]);
            int v = map.get(trip[i + 1]);
            sum += costs[u][v];
            sumWithTicket += costsWithTicket[u][v];
        }

        System.out.println(sum <= sumWithTicket + R ? "No" : "Yes");
    }

    private static String[] getPlaces(String[] arr) {
        Set<String> set = new HashSet<>();

        for (String city : arr) {
            set.add(city);
        }

        return set.stream().toArray(String[]::new);
    }

    private static double calculatePrice(String type, double cost) {
        Set<String> free = new HashSet<>(List.of("Mugunghwa", "ITX-Saemaeul", "ITX-Cheongchun"));
        Set<String> discount = new HashSet<>(List.of("S-Train", "V-Train"));
        if (free.contains(type)) {
            return 0;
        } else if (discount.contains(type)) {
            return 0.5 * cost;
        } else {
            return cost;
        }
    }
}

 

κ²°κ³Ό

  • 문제
  • 풀이
  • 1️⃣ ν”Œλ‘œμ΄λ“œ μ•Œκ³ λ¦¬μ¦˜κ³Ό ν•΄μ‹œλ₯Ό μ΄μš©ν•œ 풀이
  • κ²°κ³Ό
'πŸ‘¨πŸ»β€πŸ’» PS/바킹독' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [JAVA] λ°±μ€€ 1507번 【G2.κΆκΈˆν•œ λ―Όν˜Έγ€‘
  • [JAVA] λ°±μ€€ 2637번 【G2.μž₯λ‚œκ° 쑰립】
  • [JAVA] λ°±μ€€ 21276번 【G2.계보 볡원가 ν˜Έμ„γ€‘
  • [JAVA] λ°±μ€€ 1967번 【G4.트리의 지름】
우규이인우윀
우규이인우윀
개발자 κΏˆλ‚˜λ¬΄

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”

단좕킀

λ‚΄ λΈ”λ‘œκ·Έ

λ‚΄ λΈ”λ‘œκ·Έ - κ΄€λ¦¬μž ν™ˆ μ „ν™˜
Q
Q
μƒˆ κΈ€ μ“°κΈ°
W
W

λΈ”λ‘œκ·Έ κ²Œμ‹œκΈ€

κΈ€ μˆ˜μ • (κΆŒν•œ μžˆλŠ” 경우)
E
E
λŒ“κΈ€ μ˜μ—­μœΌλ‘œ 이동
C
C

λͺ¨λ“  μ˜μ—­

이 νŽ˜μ΄μ§€μ˜ URL 볡사
S
S
맨 μœ„λ‘œ 이동
T
T
ν‹°μŠ€ν† λ¦¬ ν™ˆ 이동
H
H
단좕킀 μ•ˆλ‚΄
Shift + /
⇧ + /

* λ‹¨μΆ•ν‚€λŠ” ν•œκΈ€/영문 λŒ€μ†Œλ¬Έμžλ‘œ 이용 κ°€λŠ₯ν•˜λ©°, ν‹°μŠ€ν† λ¦¬ κΈ°λ³Έ λ„λ©”μΈμ—μ„œλ§Œ λ™μž‘ν•©λ‹ˆλ‹€.