-
[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
'Algo Rhythm๐บ๐ > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
-