ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Algo Rhythm๐Ÿ•บ๐Ÿ’ƒ] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๊ณ ๋“์  kit ์—ฌํ–‰๊ฒฝ๋กœ
    Algo Rhythm๐Ÿ•บ๐Ÿ’ƒ/Programmers 2020. 7. 25. 15:14

    ๐Ÿ“š ๋ฌธ์ œ ์„ค๋ช…

    ์ฃผ์–ด์ง„ ํ•ญ๊ณต๊ถŒ์„ ๋ชจ๋‘ ์ด์šฉํ•˜์—ฌ ์—ฌํ–‰๊ฒฝ๋กœ๋ฅผ ์งœ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ ICN ๊ณตํ•ญ์—์„œ ์ถœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

    ํ•ญ๊ณต๊ถŒ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด 2์ฐจ์› ๋ฐฐ์—ด tickets๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๋ฐฉ๋ฌธํ•˜๋Š” ๊ณตํ•ญ ๊ฒฝ๋กœ๋ฅผ ๋ฐฐ์—ด์— ๋‹ด์•„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

     

    ์ œํ•œ์‚ฌํ•ญ

    • ๋ชจ๋“  ๊ณตํ•ญ์€ ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž 3๊ธ€์ž๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

    • ์ฃผ์–ด์ง„ ๊ณตํ•ญ ์ˆ˜๋Š” 3๊ฐœ ์ด์ƒ 10,000๊ฐœ ์ดํ•˜์ž…๋‹ˆ๋‹ค.

    • tickets์˜ ๊ฐ ํ–‰ [a, b]๋Š” a ๊ณตํ•ญ์—์„œ b ๊ณตํ•ญ์œผ๋กœ ๊ฐ€๋Š” ํ•ญ๊ณต๊ถŒ์ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

    • ์ฃผ์–ด์ง„ ํ•ญ๊ณต๊ถŒ์€ ๋ชจ๋‘ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ๋งŒ์ผ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๊ฐ€ 2๊ฐœ ์ด์ƒ์ผ ๊ฒฝ์šฐ ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๊ฐ€ ์•ž์„œ๋Š” ๊ฒฝ๋กœ๋ฅผ return ํ•ฉ๋‹ˆ๋‹ค.

    • ๋ชจ๋“  ๋„์‹œ๋ฅผ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋Š” ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

     

    ๐ŸŽฏ ์–ด๋–ป๊ฒŒ ํ’€์—ˆ๋‚˜

    ์ฒซ๋ฒˆ์งธ ์‹œ๋„ (50์ / 100์ )

    import java.util.ArrayList;
    import java.util.TreeSet;
    import java.util.HashMap;
    
    class Solution {
        public String[] solution(String[][] tickets) {
            ArrayList<String> answer = new ArrayList<>();
            HashMap<String, TreeSet<String>> graph = new HashMap<>();
            int nTravel = tickets.length + 1; // ๋น„ํ–‰๊ธฐ ํƒ€๋Š” ํšŸ์ˆ˜ =  ํ‹ฐ์ผ“ ๊ฐœ์ˆ˜ + 1
            String parent = "ICN";
            
            // init graph
            for(int i = 0; i < tickets.length; i++) {
                String from = tickets[i][0];
                String to = tickets[i][1];
                
                TreeSet<String> dest = (graph.containsKey(from)) ? graph.get(from) : new TreeSet<>();
                dest.add(to);
                graph.put(from, dest);
            }
            
            while(nTravel > 0)  {
                answer.add(parent);
                
                if(!(graph.containsKey(parent))) break;
                
                parent = graph.get(parent).pollFirst();
                nTravel--;
            }
                    
            return answer.stream().toArray(String[]::new);
        }
    }

     

    ๋‘๋ฒˆ์งธ ์‹œ๋„ (50์ / 100์ )

    import java.util.ArrayList;
    import java.util.PriorityQueue;
    import java.util.HashMap;
    
    class Solution {
        public String[] solution(String[][] tickets) {
            ArrayList<String> answer = new ArrayList<>();
            HashMap<String, PriorityQueue<String>> graph = new HashMap<>();
            int nTravel = tickets.length + 1; // ๋น„ํ–‰๊ธฐ ํƒ€๋Š” ํšŸ์ˆ˜ =  ํ‹ฐ์ผ“ ๊ฐœ์ˆ˜ + 1
            String parent = "ICN";
            
            // init graph
            for(int i = 0; i < tickets.length; i++) {
                String from = tickets[i][0];
                String to = tickets[i][1];
         
                PriorityQueue<String> dest = (graph.containsKey(from)) ? graph.get(from) : new PriorityQueue<>();
                dest.offer(to);
                graph.put(from, dest);
            }
            
            // System.out.println(graph); 
            
            while(nTravel > 0)  {
                answer.add(parent);
                
                if(!(graph.containsKey(parent))) break; 
                
                parent = graph.get(parent).poll();
                nTravel--;
            }
            
            // System.out.println(answer);
            
            return answer.stream().toArray(String[]::new);
        }
    }

     

    ์ตœ์ข… ์ฝ”๋“œ

    import java.util.Arrays;
    import java.util.Stack;
    
    class Solution {
        public String[] solution(String[][] tickets) {
            Stack<String> temp = new Stack<>();
            boolean[] visited = new boolean[tickets.length];
            
            // ๋„์ฐฉ์ง€ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ
            Arrays.sort(tickets, (o1, o2) -> o1[1].compareTo(o2[1]));
            
            // TEST
            // Arrays.stream(tickets).forEach(e -> System.out.println(e[0] + " -> " + e[1]));
            
            dfs(tickets, visited, temp, "ICN", 0);
            
            return temp.stream().toArray(String[]::new);
        }
        
        public boolean dfs(String[][] tickets, boolean[] visited, Stack<String> temp, String departure, int level) {
            temp.push(departure);
            
            if(level == tickets.length) return true; // ๋ชจ๋“  ํ•ญ๊ณต๊ถŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ๋กœ ์ฐพ์Œ
            
            for(int i = 0; i < tickets.length; i++) {
                if(!visited[i] && tickets[i][0].equals(departure)) { // backtrack 
                    visited[i] = true; // i๋ฒˆ์งธ ํ•ญ๊ณต๊ถŒ ์‚ฌ์šฉ
                    if(dfs(tickets, visited, temp, tickets[i][1], level + 1)) return true;
                    visited[i] = false; // i๋ฒˆ์งธ ํ•ญ๊ณต๊ถŒ ์‚ฌ์šฉํ•œ ๊ฑฐ ์ทจ์†Œ
                }
            }
            
            temp.pop();
            return false;
        }
    }

     

    ๐Ÿง ์™œ ์ €๋ ‡๊ฒŒ ํ’€์—ˆ๋‚˜

    ์ฒซ๋ฒˆ์งธ ์‹œ๋„ (50์ / 100์ )

    ์ฒ˜์Œ์—๋Š” ์ด ๋ฌธ์ œ๋ฅผ ๊ตณ์ด DFS๋กœ ํ’€ ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

    Hashmap๊ณผ set์„ ์ด์šฉํ•ด์„œ graph๋ฅผ ๋งŒ๋“  ํ›„ ํ‘œ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ๋•Œ๊นŒ์ง€ ๊ฒฝ๋กœ๋ฅผ ์ฐ์œผ๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋•Œ set์œผ๋กœ๋Š” TreeSet์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ TreeSet์€ ๋‚ด๋ถ€์ ์œผ๋กœ BST๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์ •๋ ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (์‚ฌ์‹ค ๋‚ด๋ถ€์ ์œผ๋กœ BST๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ treeset์ด๋ผ๋Š” ๋ช…์นญ๊ณผ ์ž๋™ ์ •๋ ฌ์ด๋ผ๋Š” ์†์„ฑ์„ ๋ฐ”ํƒ•์œผ๋กœ ํ•œ ๋‚ด ์ถ”์ธก์ด๋‹ค.)

    ๊ทธ๋ฆฌ๊ณ  ์ฒ˜์Œ์—๋Š” ๊ฐ™์€ ํ•ญ๊ณต๊ถŒ์ด ์—ฌ๋Ÿฌ ์žฅ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์„ ๋ชป ํ•ด์„œ HashMap๊ณผ Set์œผ๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ํ‘œํ˜„ํ–ˆ๋‹ค.

     

    ๋‘๋ฒˆ์งธ ์‹œ๋„ (50์ / 100์ )

    ๊ฐ™์€ ํ•ญ๊ณต๊ถŒ์ด ์—ฌ๋Ÿฌ ์žฅ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋œ ํ›„ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด TreeSet์„ PriorityQueue๋กœ ๋ฐ”๊ฟจ๋‹ค. ํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ๋‹ค๋ฅด์ง€ ์•Š์•˜๋‹ค.

     

    ์ตœ์ข… ์ฝ”๋“œ

    ๋ฐ˜๋ก€๋ฅผ ๋„์ €ํžˆ ์ƒ๊ฐ๋‚˜์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ๋ถ„๋“ค์˜ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ backtracking์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

    ๋” ์ž์„ธํžˆ ๋งํ•˜๋ฉด tree์˜ depth๊ฐ€ ํ•ญ๊ณต๊ถŒ์˜ ๊ฐœ์ˆ˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ ๋ชจ๋“  ํ•ญ๊ณต๊ถŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌํ–‰์„ ํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ ์ฐพ๋Š” ๊ฒฝ์šฐ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฅผ base case๋กœ ๋‘”๋‹ค.

    ๊ทธ๋ฆฌ๊ณ  DFS๋ฅผ ํ•  ๋•Œ๋Š” ํ•ญ๊ณต๊ถŒ์„ ์ผ์ผ์ด ํ™•์ธํ•ด์„œ ์ถœ๋ฐœ์ง€๊ฐ€ ๊ฐ™๊ณ  ์•„์ง ํ•ญ๊ณต๊ถŒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ทธ ๊ฒฝ๋กœ๋ฅผ ๋Œ€์ƒ์œผ๋กœ DFS๋ฅผ ํ•œ๋‹ค.

     

    ๐Ÿ“– ๋ฌด์—‡์„ ๋ฐฐ์› ๋‚˜

    Backtracking์„ ๊นŒ๋จน๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ์•„๋ž˜ ๋ธ”๋กœ๊ทธ์—์„œ ์„ค๋ช…์„ ์ž˜ ํ•ด์ฃผ์…”์„œ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค!

    https://idea-sketch.tistory.com/29

     

    [์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋˜์ถ”์ (Backtracking)์„ ์•Œ์•„๋ณด์ž.

    ์˜ค๋Š˜์˜ ์ฃผ์ œ๋Š” ๋˜์ถ”์ (Backtracking) ์ด๋‹ค. ์ €๋ฒˆ ํฌ์ŠคํŒ…์ธ ๊นŠ์ด์šฐ์„ ํƒ์ƒ‰(Depth-First Search)๊ณผ ๋„“์ด์šฐ์„ ํƒ์ƒ‰(Breath-First Search)์˜ ๋ชธํ’€๊ธฐ๋ฅผ ๊ฑฐ์น˜๊ณ  ์ตœ๋‹จ๊ฒฝ๋กœ(Shortest Path) ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋“ค์–ด๊ฐ€๋Š” ์ฒซ ๊ฑธ์Œ์ด๋ผ..

    idea-sketch.tistory.com

     

    ๋Œ“๊ธ€

Designed by Tistory.