배달(Java)

bearMinΒ·2024λ…„ 3μ›” 11일

🎯문제

N개의 λ§ˆμ„λ‘œ 이루어진 λ‚˜λΌκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이 λ‚˜λΌμ˜ 각 λ§ˆμ„μ—λŠ” 1λΆ€ν„° NκΉŒμ§€μ˜ λ²ˆν˜Έκ°€ 각각 ν•˜λ‚˜μ”© λΆ€μ—¬λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 각 λ§ˆμ„μ€ μ–‘λ°©ν–₯으둜 톡행할 수 μžˆλŠ” λ„λ‘œλ‘œ μ—°κ²°λ˜μ–΄ μžˆλŠ”λ°, μ„œλ‘œ λ‹€λ₯Έ λ§ˆμ„ 간에 이동할 λ•ŒλŠ” 이 λ„λ‘œλ₯Ό μ§€λ‚˜μ•Ό ν•©λ‹ˆλ‹€. λ„λ‘œλ₯Ό μ§€λ‚  λ•Œ κ±Έλ¦¬λŠ” μ‹œκ°„μ€ λ„λ‘œλ³„λ‘œ λ‹€λ¦…λ‹ˆλ‹€. ν˜„μž¬ 1번 λ§ˆμ„μ— μžˆλŠ” μŒμ‹μ μ—μ„œ 각 λ§ˆμ„λ‘œ μŒμ‹ 배달을 ν•˜λ €κ³  ν•©λ‹ˆλ‹€. 각 λ§ˆμ„λ‘œλΆ€ν„° μŒμ‹ 주문을 λ°›μœΌλ €κ³  ν•˜λŠ”λ°, N개의 λ§ˆμ„ μ€‘μ—μ„œ K μ‹œκ°„ μ΄ν•˜λ‘œ 배달이 κ°€λŠ₯ν•œ λ§ˆμ„μ—μ„œλ§Œ 주문을 λ°›μœΌλ €κ³  ν•©λ‹ˆλ‹€. λ‹€μŒμ€ N = 5, K = 3인 경우의 μ˜ˆμ‹œμž…λ‹ˆλ‹€.

μœ„ κ·Έλ¦Όμ—μ„œ 1번 λ§ˆμ„μ— μžˆλŠ” μŒμ‹μ μ€ [1, 2, 4, 5] 번 λ§ˆμ„κΉŒμ§€λŠ” 3 μ΄ν•˜μ˜ μ‹œκ°„μ— 배달할 수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 3번 λ§ˆμ„κΉŒμ§€λŠ” 3μ‹œκ°„ μ΄λ‚΄λ‘œ 배달할 수 μžˆλŠ” κ²½λ‘œκ°€ μ—†μœΌλ―€λ‘œ 3번 λ§ˆμ„μ—μ„œλŠ” 주문을 λ°›μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 1번 λ§ˆμ„μ— μžˆλŠ” μŒμ‹μ μ΄ 배달 주문을 받을 수 μžˆλŠ” λ§ˆμ„μ€ 4κ°œκ°€ λ©λ‹ˆλ‹€.
λ§ˆμ„μ˜ 개수 N, 각 λ§ˆμ„μ„ μ—°κ²°ν•˜λŠ” λ„λ‘œμ˜ 정보 road, μŒμ‹ 배달이 κ°€λŠ₯ν•œ μ‹œκ°„ Kκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μŒμ‹ 주문을 받을 수 μžˆλŠ” λ§ˆμ„μ˜ 개수λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

μ œν•œμ‚¬ν•­

  • λ§ˆμ„μ˜ 개수 N은 1 이상 50 μ΄ν•˜μ˜ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • road의 길이(λ„λ‘œ μ •λ³΄μ˜ 개수)λŠ” 1 이상 2,000 μ΄ν•˜μž…λ‹ˆλ‹€.
  • road의 각 μ›μ†ŒλŠ” λ§ˆμ„μ„ μ—°κ²°ν•˜κ³  μžˆλŠ” 각 λ„λ‘œμ˜ 정보λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • roadλŠ” 길이가 3인 배열이며, μˆœμ„œλŒ€λ‘œ (a, b, c)λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • a, b(1 ≀ a, b ≀ N, a != b)λŠ” λ„λ‘œκ°€ μ—°κ²°ν•˜λŠ” 두 λ§ˆμ„μ˜ 번호이며, c(1 ≀ c ≀ 10,000, cλŠ” μžμ—°μˆ˜)λŠ” λ„λ‘œλ₯Ό μ§€λ‚˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μž…λ‹ˆλ‹€.
    • 두 λ§ˆμ„ a, bλ₯Ό μ—°κ²°ν•˜λŠ” λ„λ‘œλŠ” μ—¬λŸ¬ κ°œκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • ν•œ λ„λ‘œμ˜ 정보가 μ—¬λŸ¬ 번 μ€‘λ³΅ν•΄μ„œ μ£Όμ–΄μ§€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • KλŠ” μŒμ‹ 배달이 κ°€λŠ₯ν•œ μ‹œκ°„μ„ λ‚˜νƒ€λ‚΄λ©°, 1 이상 500,000 μ΄ν•˜μž…λ‹ˆλ‹€.
  • μž„μ˜μ˜ 두 λ§ˆμ„κ°„μ— 항상 이동 κ°€λŠ₯ν•œ κ²½λ‘œκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€.
  • 1번 λ§ˆμ„μ— μžˆλŠ” μŒμ‹μ μ΄ K μ΄ν•˜μ˜ μ‹œκ°„μ— 배달이 κ°€λŠ₯ν•œ λ§ˆμ„μ˜ 개수λ₯Ό return ν•˜λ©΄ λ©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

NroadKresult
5[[1,2,1],[2,3,3],[5,2,2],[1,4,2],[5,3,1],[5,4,2]]34
6[[1,2,1],[1,3,2],[2,3,2],[3,4,3],[3,5,2],[3,5,3],[5,6,1]]44

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1
문제의 μ˜ˆμ‹œμ™€ κ°™μŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #2

μ£Όμ–΄μ§„ λ§ˆμ„κ³Ό λ„λ‘œμ˜ λͺ¨μ–‘은 μ•„λž˜ κ·Έλ¦Όκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

1번 λ§ˆμ„μ—μ„œ 배달에 4μ‹œκ°„ μ΄ν•˜κ°€ κ±Έλ¦¬λŠ” λ§ˆμ„μ€ [1, 2, 3, 5] 4κ°œμ΄λ―€λ‘œ 4λ₯Ό return ν•©λ‹ˆλ‹€.


βœοΈν’€μ΄

μ½”λ“œ

import java.util.*;

class Solution {
	// λ…Έλ“œ 클래슀
    static class Node {
        int a, b, c;
        
        public Node(int a, int b, int c) {
            this.a = a;
            this.b = b;
            this.c = c;
        }
    }
    public int solution(int N, int[][] road, int K) {
    	// 1번 λ§ˆμ„μ€ 무쑰건 갈 수 있기 λ•Œλ¬Έμ— 1둜 μ΄ˆκΈ°ν™”
        int answer = 1;
        // κ·Έλž˜ν”„λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ λ°°μ—΄
        ArrayList<ArrayList<Node>> map = new ArrayList<>();
        
        // λ°°μ—΄λ§ˆλ‹€ arraylist 생성
        for(int i = 0; i < N + 1; i++)
            map.add(new ArrayList<>());
        
        // road 배열에 μžˆλŠ” 값을 μ‚¬μš©ν•΄μ„œ map에 μ €μž₯
        for(int i = 0; i < road.length; i++) {
            map.get(road[i][0]).add(new Node(road[i][0], road[i][1], road[i][2]));
            map.get(road[i][1]).add(new Node(road[i][1], road[i][0], road[i][2]));
        }
        
        // 큐 생성
        Queue<Node> q = new LinkedList<>();
        // 각 λ§ˆμ„λ§ˆλ‹€ κ±Έλ¦¬λŠ” μ‹œκ°„μ„ μ €μž₯
        int[] time = new int[N+1];
        
        // MAX_VALUE둜 μ΄ˆκΈ°ν™”
        for(int i = 2; i < N+1; i++)
            time[i] = Integer.MAX_VALUE;
        
        // 1번 λ§ˆμ„κ³Ό μ—°κ²°λœ λͺ¨λ“  값을 큐에 μ €μž₯
        q.addAll(map.get(1));
        
        // 큐에 값이 없을 λ•ŒκΉŒμ§€ 반볡
        while(!q.isEmpty()) {
            Node n = q.poll();
            
            // aμ—μ„œ b둜 갈 λ•Œ μ‹œκ°„μ΄ b보닀 크면 continue
            if(time[n.b] <= time[n.a] + n.c) 
            	continue;
            
            // bκΉŒμ§€ κ±Έλ¦° μ‹œκ°„μ„ time[b]에 μ €μž₯
            time[n.b] = time[n.a] + n.c;
            // b λ§ˆμ„κ³Ό μ—°κ΄€λœ λͺ¨λ“  값을 큐에 μ €μž₯
            q.addAll(map.get(n.b));
        }

		// time λ°°μ—΄μ˜ 길이만큼 반볡
        // K보닀 μž‘κ±°λ‚˜ 같을 경우 answer 증가
        for(int i = 2; i < time.length; i++)
            if(time[i] <= K) 
            	answer++;
        
        return answer;
    }
}

μ„€λͺ…

κ·Έλž˜ν”„μ™€ bfs 탐색을 톡해 μ§„ν–‰ν•˜μ˜€λ‹€.

μ €μž₯ν•˜κΈ° 쉽도둝 Node 클래슀λ₯Ό λ§Œλ“€μ—ˆλ‹€. aλŠ” μ‹œμž‘ λ§ˆμ„, bλŠ” 도착 λ§ˆμ„, cλŠ” κ±Έλ¦° μ‹œκ°„μ„ λ‚˜νƒ€λ‚΄λ©° 값을 μ €μž₯ν•˜κΈ° μœ„ν•΄μ„œ μ‚¬μš©ν•  μ˜ˆμ •μ΄λ‹€.

answer = 1둜 μ΄ˆκΈ°ν™”λ₯Ό μ§„ν–‰ν•˜λŠ”λ° 1번 λ§ˆμ„μ€ 무쑰건 갈 수 있기 λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ 1번 λ§ˆμ„μ„ μ œμ™Έν•œ λ‹€λ₯Έ λ§ˆμ„λ“€μ„ ꡬ해주면 λœλ‹€.

κ·Έλž˜ν”„λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ 배열을 μ„ μ–Έν•œλ‹€. μ΄λ•Œ Nodeλ₯Ό μ‚¬μš©ν•œλ‹€.
λ°°μ—΄λ§ˆλ‹€ ArrayListλ₯Ό 생성해쀀닀.

이제 road 배열에 μžˆλŠ” 값을 μ‚¬μš©ν•΄μ„œ κ·Έλž˜ν”„λ₯Ό 생성할 것이닀. road[i][0]은 μ‹œμž‘ λ§ˆμ„ road[i][1]은 도착 λ§ˆμ„ road[i][2]λŠ” κ±Έλ¦° μ‹œκ°„μ΄λ‹€. 그런데 μ΄λ•Œ μ€‘μš”ν•œ 것은 μ–‘λ°©ν–₯이기 λ•Œλ¬Έμ— μ‹œμž‘ λ§ˆμ„κ³Ό 도착 λ§ˆμ„μ„ λ°”κΎΌ μƒνƒœλ‘œλ„ μ €μž₯을 ν•΄μ£Όμ–΄μ•Όν•œλ‹€λŠ” 것이닀. λ”°λΌμ„œ road[i][1]을 μ‹œμž‘ λ§ˆμ„λ‘œ road[i][0]을 도착 λ§ˆμ„λ‘œ road[i][2]λ₯Ό κ±Έλ¦° μ‹œκ°„μœΌλ‘œ 각각 μ €μž₯ν•΄μ€€λ‹€.

bfs 탐색을 μ§„ν–‰ν•˜κΈ° μœ„ν•΄ 큐λ₯Ό μƒμ„±ν•œλ‹€. λ˜ν•œ 각 λ§ˆμ„λ§ˆλ‹€ κ±Έλ¦¬λŠ” μ‹œκ°„μ„ μ €μž₯ν•˜κΈ° μœ„ν•΄ intν˜• 배열도 μƒμ„±ν•œλ‹€.

time의 값을 MAX_VALUE둜 μ΄ˆκΈ°ν™”λ₯Ό μ‹œμΌœμ€€λ‹€. λ˜ν•œ 1번 λ§ˆμ„κ³Ό μ—°κ²°λœ λͺ¨λ“  값을 큐에 μ €μž₯ν•œλ‹€. μ—¬κΈ°κΉŒμ§€ ν•˜λ©΄ bfs νƒμƒ‰μ˜ 쀀비과정은 끝이닀.

bfs 탐색을 μ§„ν–‰ν•œλ‹€. 큐에 값이 없을 λ•ŒκΉŒμ§€ λ°˜λ³΅μ„ μ§„ν–‰ν•˜λ©° 값을 ν•˜λ‚˜ μ œκ±°ν•œλ‹€. Node n에 μ œκ±°ν•œ 값을 μ €μž₯ν•˜κ³  ifλ¬Έ 비ꡐλ₯Ό μ§„ν–‰ν•œλ‹€. μ—¬κΈ°μ„œ μ£Όμ˜ν•  점은 time 배열을 μ΄ˆκΈ°ν™”ν•  λ•Œ 2λΆ€ν„° 진행을 ν–ˆκΈ° λ•Œλ¬Έμ— time[1]μ—λŠ” 0이 λ“€μ–΄μžˆλ‹€λŠ” 것이닀. ν˜„μž¬ n.aμ—λŠ” 1이 무쑰건 μ‘΄μž¬ν•  것이고, n.bλŠ” 1κ³Ό μ—°κ²°λœ λ‹€λ₯Έ λ§ˆμ„μ΄ λœλ‹€. n.a + n.cκ°€ MAX_VALUE보닀 μž‘λ‹€λ©΄ if문을 λ„˜μ–΄κ°€κ³  time[n.b] = time[n.a] + n.cλ₯Ό μ‚¬μš©ν•΄ κ±Έλ¦¬λŠ” μ‹œκ°„μ„ μ €μž₯ν•œλ‹€. 이후 n.b의 탐색도 μ§„ν–‰ν•˜κΈ° μœ„ν•΄ q.addAll(map.get(n.b))λ₯Ό μ‚¬μš©ν•΄ n.b λ§ˆμ„κ³Ό μ—°κ΄€λœ λͺ¨λ“  값을 큐에 μ €μž₯ν•΄μ€€λ‹€.

이런 μ‹μœΌλ‘œ μœ„μ˜ λ°˜λ³΅μ„ λͺ¨λ‘ μ§„ν–‰ν•œ 뒀에 λΉ μ Έλ‚˜μ˜€λ©΄ timeμ—λŠ” 각 λ§ˆμ„μ— 갈 수 μžˆλŠ” μ΅œμ†Ÿκ°’μ΄ μ €μž₯이 λ˜μ–΄μžˆμ„ 것이닀. λ°˜λ³΅λ¬Έμ„ 톡해 μ €μž₯된 값이 K보닀 μž‘κ±°λ‚˜ 같은지 비ꡐλ₯Ό ν•˜κ³  쑰건에 λ§Œμ‘±ν•˜λ©΄ answerλ₯Ό μ¦κ°€μ‹œμΌœμ€€λ‹€.

λͺ¨λ“  반볡이 λλ‚œ λ’€ answerλ₯Ό λ°˜ν™˜ν•˜λ©΄ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€!


πŸ’‘λŠλ‚€ 점

κ·Έλž˜ν”„ 방식과 bfs 탐색을 μ§„ν–‰ν•΄μ„œ 문제λ₯Ό ν•΄κ²°ν–ˆλ‹€. 이후 λ‹€λ₯Έ λΆ„λ“€μ˜ 풀이λ₯Ό 보기 μœ„ν•΄ μ—¬λŸ¬ λΈ”λ‘œκ·Έλ₯Ό μ°Ύμ•„λ΄€λŠ”λ° μš°μ„ μˆœμœ„ 큐λ₯Ό μ‚¬μš©ν•˜κ³  μ—¬λŸ¬ μ΅œμ ν™”λ₯Ό μœ„ν•œ 방식듀을 μ‚¬μš©ν•˜λŠ” κ±Έ 보고 μ–΄λ–»κ²Œ μ €λŸ° 생각이 λ“€κΉŒ κ°νƒ„ν–ˆλ‹€. 이번 문제λ₯Ό ν’€ λ•Œ μƒκ°ν•˜λ©΄μ„œ κΌ¬μ΄λŠ” 뢀뢄듀이 λ§Žμ•„μ„œ 쑰금 νž˜λ“€μ—ˆλ‹€. 곡책에 μ μœΌλ©΄μ„œ 풀어도 λ˜λŠ”λ° κ΄œν•œ κ³ μ§‘μœΌλ‘œ ν’€λ‹€κ°€ 였히렀 μ‹œκ°„μ„ 더 μ“°λŠ” 것 κ°™λ‹€..γ…Žγ…Ž


링크

문제 링크

profile
μ†Œμ†Œν•œ 곡뢀기둝

0개의 λŒ“κΈ€