-
728x90๋ฐ์ํ
๋ ์ง : 2021 ๋ 11 ์ 2 ์ผ
์์ฒญ ๊ฐ์ : ๊ทธ๋ํ ์ดํด์ ์๋ฃ ๊ตฌ์กฐ , ๋๋น ์ฐ์ ํ์ (BFS) (1) , ๋๋น ์ฐ์ ํ์ (BFS) (2), ๊น์ด ์ฐ์ ํ์ (DFS)๊ทธ๋ํ
๊ธฐ๋ณธ ์ฉ์ด
- ๊ทธ๋ํ๋ ์์ดํ ๋ค๊ณผ ์์ดํ ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ๊ด๊ณ๋ฅผ ํํํ๋ค
- Vertex (์ ์ ) : ์ฐ๊ฒฐ์
- Edge (๊ฐ์ ) : ์ฐ๊ฒฐ ์
- Degree (์ฐจ์) : ์ ์ ์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์
- ๊ทธ๋ํ๋ vertex์ ์งํฉ๊ณผ ์ด๋ค์ ์ฐ๊ฒฐํ๋ edges์ ์งํฉ์ผ๋ก ๊ตฌ์ฑ๋ ์๋ฃ
์ ํ
์ด๋ฏธ์ง ์ถ์ฒ : https://www.hackerearth.com/practice/algorithms/graphs/graph-representation/tutorial/
- ๋ฌดํฅ ๊ทธ๋ํ (Undirected → ์๋ฐฉํฅ)
- ์ ํฅ ๊ทธ๋ํ(Directed)
- ๊ฐ์ค์น ๊ทธ๋ํ(Weighed)
- ์ฌ์ดํด์ด ์๋ ๋ฐฉํฅ ๊ทธ๋ํ
- ์์ ๊ทธ๋ํ
- ๋ถ๋ถ ๊ทธ๋ํ
- ํธ๋ฆฌ๋ ๊ทธ๋ํ์ ํ ์ข
๋ฅ์
[ํธ๋ฆฌ vs ๊ทธ๋ํ ์ฐจ์ด์ ]Tree Graph Cycle X O Root O X Parent-Child O X
๊ทธ๋ํ ์ข ๋ฅ
1. ์ธ์ ํ๋ ฌ
์ธ์ ํ๋ ฌ์ ๋ ์ ์ ์ ์ฐ๊ฒฐํ๋ ๊ฐ์ ์ ์ ๋ฌด๋ฅผ ํ๋ ฌ๋ก ํํํ๋ค.
ํ์ง๋ง, ์ ์๊ฐ์ ๊ฐ์ง๋ ๊ฐ์ค์น๊ฐ ์๊ณ N = 10000๊ฐ๋ผ๋ฉด int[10000][10000] ์ ์ธ์ ํ๋ ฌ์ ์์ฑํด์ผํ๋๋ฐ ์ด๋ 1์ต๊ฐ์. intํ์ด 1์ต๊ฐ๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ 4์ต๋ฐ์ดํธ๊ฐ ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฑด์ด 400MB๋ณด๋ค ํฌ๋ฉด ์๊ด์์ง๋ง ์ฃผ๋ก ์ด๋ณด๋ค ์์์ ์ธ์ ํ๋ ฌ์ ์ฌ์ฉํ ์ ์๋ค. → ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํด์ผํจ
2. ์ธ์ ๋ฆฌ์คํธ
๊ฐ ์ ์ ์ ๋ํ ์ธ์ ์ ์ ๋ค์ ์์ฐจ์ ์ผ๋ก ํํํ์ฌ ํ๋์ ์ ์ ์ ๋ํ ์ธ์ ์ ์ ๋ค์ ๊ฐ๊ฐ ๋ ธ๋๋ก ์ฐ๊ฒฐํ๋ ๋ฆฌ์คํธ๋ก ์ ์ฅํ๋ค.
์ ์ ๋ ์ด๋์ ๋ ์๊ณ ๊ฐ์ ๋ ๋ง์ผ๋ฉด( ๋ฐ์ง ๊ทธ๋ํ), ์ธ์ ๋ฆฌ์คํธ๋ ํ๋์ฉ ์ ๋ถ ๋ค์ฌ๋ค ๋ด์ผํ๊ธฐ๋๋ฌธ์ ํจ์จ์ฑ์ด ์ข์ง ์๋ค. ๋ํ, ์ ๋ ฅ์ด 2์ฐจ์์์ผ๋ก ๋ค์ด์จ๋ค๋ฉด → ์ธ์ ํ๋ ฌ์ ์ฌ์ฉํด์ผํ๋ค
3. ๊ฐ์ ๋ฆฌ์คํธ
๋ ์ ์ ์ ๋ํ ๊ฐ์ ๊ทธ ์์ฒด๋ฅผ ๊ฐ์ฒด๋ก ํํํ์ฌ ๋ฆฌ์คํธ๋ก ์ ์ฅํ๋ฉฐ, ๊ฐ์ ์ ํํํ๋ ๋ ์ ์ ์ ์ ๋ณด๋ฅผ ๋ํ๋ธ๋ค(์์ ์ ์ , ๋ ์ ์ )
๊ฐ์ (์์ ์ ์ , ๋ ์ ์ )์ ์ ๋ณด๋ฅผ ๊ฐ์ฒด๋ก ํํํ์ฌ ๋ฆฌ์คํธ์ ์ ์ฅ. ์ฆ, ๊ฐ์ ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ๋ก ์ ์ง
์ฆ, ๋ ธ๋๊ฐ ๋ง์ผ๋ฉด ์ธ์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ ์ด ๋ง์ผ๋ฉด ์ธ์ ํ๋ ฌ์ ์ฌ์ฉ
๊ทธ๋ํ ํํ
์๋ฐ์์ ๊ทธ๋ํ๋ฅผ ํํํ๋ ๋ฐฉ์์๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค. ๋๋ ์ฃผ๋ก 2D ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ์ธ์ ๋ฐฐ์ด ํํ๋ก ๋ํ๋ด๋๋ฐ, ์ด๋ฒ ํจ์คํธ์บ ํผ์ค ๊ฐ์์์ HashMap์ผ๋ก ํํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ๋๋ฐ ์ธ์์ ์ด์๋ค.
ArrayList๋ฅผ ์ ํ์ฉํ๋ ํธ์ด ์๋๋ผ, ์ธ์ ๋ฆฌ์คํธ ๊ตฌํ์ด ๋ง์ด ์ด๋ ค์ ๋๋ฐ ๊ฐ์๋ฅผ ๋ฃ๊ณ ๋๋ ์ดํด๊ฐ ๋ง์ด ๋ฌ๋ค.
๋ฌผ๋ก ๋ฌธ์ ์ ์ ๋ชฉ ๊ฐ๋ฅํ ์ ๋์ธ์ง๋ ๋ฐฑ์ค์ ์ด์ด๋ด์ผ..HashMap<String , ArrayList<String>> graph = new HashMap<>(); graph.put("A", new ArrayList<String>(Arrays.asList("B", "C"))); graph.put("B", new ArrayList<String>(Arrays.asList("A", "D"))); graph.put("C", new ArrayList<String>(Arrays.asList("A", "G", "H", "I"))); //์ดํ ์๋ต
1. HashMap ์ ์ฌ์ฉํ์ฌ ๊ทธ๋ํ ํํ
2. put () ์ ์ฌ์ฉํ์ฌ ๊ฐ ๋ ธ๋ ๋น ์ฐ๊ฒฐ๋ ๋ ธ๋๋ฅผ ์ฝ์
3. Arrays.asList() ๋ฅผ ์ฌ์ฉํ๋ฉด, ์ฝ๊ฒ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค ์ ์๋ค.
๋๋น ์ฐ์ ํ์
๋ณธ ๊ฐ์ข์์๋ visited์ needVisit ๋ฆฌ์คํธ ๋๊ฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋ฆฌ์คํธ์ ๋ฐฉ๋ฌธ์ค์ธ ํ๋ฅผ ๋ฆฌ์คํธ๋ก ๊ตฌํํ์๋๋ฐ, ๋๋ ํ ๋ฐฉ์์ด ๋ ์ฝ๋ค๊ณ ๋๋ผ๊ธฐ์ ํ๋ฅผ ์ฌ์ฉํ์ฌ BFS๋ฅผ ๊ตฌํํด ๋ณด๊ฒ ๋ค.
private static void bfs(HashMap<String, ArrayList<String>> graph, String startNode) { StringBuilder sb = new StringBuilder(); Queue<String> q = new LinkedList<>(); ArrayList<String> visited = new ArrayList<>(); q.offer(startNode); while(!q.isEmpty()) { String currentNode = q.poll(); //ํ์ฌ ๋ฐฉ๋ฌธ์ค์ธ ๋ ธ๋ if(visited.contains(currentNode)) continue; //์ด๋ฏธ ๋ฐฉ๋ฌธ์ค์ด๋ผ๋ฉด pass sb.append(currentNode + "-> "); //ํ์ฌ ๋ฐฉ๋ฌธ์ค์ธ ๋ ธ๋ sb์์ถ๊ฐ visited.add(currentNode); //๋ฐฉ๋ฌธ์ฒ๋ฆฌ q.addAll(graph.get(currentNode)); //ํ์ฌ ๋ ธ๋์ ํ์ ์์๋ค์ ํ์์ถ๊ฐ } sb.setLength(sb.length()-3); System.out.println(sb.toString()); }
๋ณดํต visited ๋ฆฌ์คํธ๋ boolean ํํ์ ๋ฐฐ์ด๋ก ํํํ๋๋ฐ, ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ .contains()๋ฅผ ์ฌ์ฉํ ์ ์์ด์ ํธํ๋ค.
์ค๋ช ์ ์ฃผ์์ฒ๋ฆฌ ํด๋จ์ง๋ง, ํ์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ ๋ฆฌ์คํธ๋ฅผ ๊ตฌํํ ํ ์์์ ์ ํ์ ๋๊ณ ํ๊ฐ ๋น๋๊น์ง ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ค์ ํ์ ๋ด์ ๋ฐ๋ณตํ๋ค.
๋ง์ผ ์๋ ๊ทธ๋ํ๋ผ๋ฉด,
1. A ๋ฅผ ํ์ ๋ด๋๋ค (start node)
2. ๋ฐ๋ณต๋ฌธ ์์:
3. ํ์ ๋งจ ์์ ๋บ๋ค -> A
4. ๋ฐฉ๋ฌธ์ค์ธ๊ฐ? no -> A๋ฅผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํด์ฃผ๊ณ , A์ ์ฐ๊ฒฐ๋ B์ C๋ฅผ ํ์ ๋ฃ๋๋ค
5. ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋์๊ฐ์ ํ์ ๋งจ ์์ ๋บ๋ค -> B
6. ๋ฐฉ๋ฌธ์ค์ธ๊ฐ? no -> B๋ฅผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ํด์ฃผ๊ณ , B์ ์ฐ๊ฒฐ๋ D,E,F๋ฅผ ํ์ ๋ฃ๋๋ค
ํ์ฌ ํ ์ํ :[C, D, E, F]
7. ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋์๊ฐ์ ํ์ ๋งจ ์์ ๋บ๋ค -> C
8. ๋ฐฉ๋ฌธ ์ค์ธ๊ฐ ? no -> C์ ์์์ธ H, I ,G๋ฅผ ํ์ ์ฝ์
ํ์ฌ ํ ์ํ : [ D, E, F, H, I, G]
์ ๋ ธ๋๋ค์ ์์๋ค์ด ์๊ธฐ ๋๋ฌธ์ ์์ฐจ์ ์ผ๋ก ๋น ์ง๊ณ ๋๋ฉด ์ต์ข ์์๋
A -> B -> C -> D -> E -> F-> G -> H -> I ๊ฐ ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค
์ ํ๋ก๊ทธ๋จ์ ๋๋ ค๋ณด๋ฉด, ์ฑ๊ณต์ ์ผ๋ก BFS ๊ฐ ๊ตฌํ๋จ์ ํ์ธํด ๋ณผ ์ ์๋ค.
๊น์ด ์ฐ์ ํ์
์ฃผ๋ก ์ฌ๊ท ํํ๋ก ์ฐ์ธ ๊น์ด ์ฐ์ ํ์์ ๋ง์ด ๋ดค๋๋ฐ, BFS์ ๊ฑฐ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณธ ๊ฐ์ข์์ ๊ฐ๋ฅด์ณ์ฃผ์๊ธฐ ๋๋ฌธ์ ๋๋ฌด ํธ๋ฆฌํ๋ค.
ํญ์ ๋๋น ์ฐ์ ํ์๋ง ์ฌ์ฉํ๋ค๊ฐ DFS๊ฐ ์๊ฐ์ด ์๋์ ๋ชปํผ ๋ฌธ์ ๊ฐ ์๋๋ฐ ์ด๊ฐ ๊ฐ๋ฆฐ๋ค... BFS ๊ตฌํ๊ณผ ํ์ค ๋นผ๊ณ ๊ฐ๋ค๊ณ ๋ณด๋ฉด ๋๋ค. BFS๋ ํ๋ฅผ ์ฌ์ฉํ์ง๋ง, DFS๋ ์คํ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ค. ์ฆ, BFS์์ current Node๋ฅผ poll ํด์ ๋งจ ์์ ๋ค์ด๊ฐ ์์๋ฅผ ๋นผ๋๋ค๋ฉด DFS๋ ์คํ(๋ฆฌ์คํธ)์ ๊ฐ์ฅ ๋ง์ง๋ง ์์๋ฅผ ๋นผ๋ด๋ฉด ๋๋ค !
private static void dfs(HashMap<String, ArrayList<String>> graph, String startNode) { StringBuilder sb = new StringBuilder(); ArrayList<String> visited = new ArrayList<>(); ArrayList<String> stack = new ArrayList<>(); stack.add(startNode); while(!stack.isEmpty()) { String currentNode = stack.remove(stack.size()-1);//๋ง์ง๋ง ์์๋ฅผ pollํ๋ค if(visited.contains(currentNode))continue; //์ด๋ฏธ ๋ฐฉ๋ฌธ์ค์ด๋ผ๋ฉด pass sb.append(currentNode + "-> "); //ํ์ฌ ๋ ธ๋ ํ๋ฆฐํธ visited.add(currentNode); //๋ฐฉ๋ฌธ์ฒ๋ฆฌ stack.addAll(graph.get(currentNode)); //ํ์ฌ ๋ ธ๋ ์์ ๋ค ๋ํ๊ธฐ } sb.setLength(sb.length()-3); System.out.println(sb.toString()); }
BFS ์๋ ๋ค๋ฅด๊ฒ, ํ์ ๋ ธ๋๋ฅผ ๋จผ์ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ด ์๋๋ผ ์์ ๋ ธ๋๋ถํฐ ๋ฐฉ๋ฌธํ๋ค.
์์์ ์ฐ์ธ ์์๋ก DFS๋ฅผ ๋ฐ๋ผ๋ณธ๋ค๋ฉด,
1. A ๋ฅผ ์คํ์ ๋ด๋๋ค (์ฝ๋์์ ๋ฆฌ์คํธ๋ก ๊ตฌํ)
2. ๋ฐ๋ณต๋ฌธ ์์:
3. ๊ฐ์ฅ ์ต์ ์ ๋ํ ์์๋ฅผ ์คํ์์ ๋บ๋ค : A
4. ๋ฐฉ๋ฌธํ๋๊ฐ ? no -> ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ํ, A ์ ์์๋ค์ ์คํ์ ๋ฃ๋๋ค [B, C]
5. ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋์๊ฐ์, ๊ฐ์ฅ ์ต์ ์์๋ฅผ ๋บ๋ค : C
6. ๋ฐฉ๋ฌธํ๋๊ฐ ? no -> ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ํ, C ์ ์์๋ค์ ์คํ์ ๋ฃ๋๋ค [B ,G, H ,I ]
7. ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋์๊ฐ์, ๊ฐ์ฅ ์ต์ ์์๋ฅผ ๋บ๋ค : I
8. ๋ฐฉ๋ฌธํ๋๊ฐ ? no -> ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ํ I ์ ์์์ ์คํ์ ๋ฃ๋๋ค -> ์์
ํ์ฌ ์คํ : [B, G, H]
9. ๊ฐ์ฅ ์ต์ ์์ H ๋ฅผ ๋นผ๋ด๊ณ ์์์ด ์์ผ๋ ๋ค์ G๋ฅผ ๋นผ๊ณ ๋ง์ฐฌ๊ฐ์ง๋ก ์์์ด ์์ผ๋ B๋ฅผ ๋นผ๋ธ๋ค
10. B๋ ์์์ด ์๊ธฐ ๋๋ฌธ์ ์์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค
์ต์ข ์ ์ผ๋ก,
A-> C-> I-> H-> G-> B-> F-> E-> D ์์๋ก ๊ทธ๋ํ๋ฅผ ์ํํ๊ฒ ๋๋ค.
์ ์ฝ๋๋ฅผ ๋๋ ค๋ณด๋ฉด,
์ ์์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ด ์๋ ๋ ๊ฒ์ ํ์ธ ํด ๋ณผ ์ ์๋ค.
ํจ์คํธ์บ ํผ์ค ํ๊ธ ์ฑ๋ฆฐ์ง ๋ฐ๋ก๊ฐ๊ธฐ๐ https://bit.ly/3FVdhDa
์๊ฐ๋ฃ 100% ํ๊ธ ์ฑ๋ฆฐ์ง | ํจ์คํธ์บ ํผ์ค
๋ฑ 5์ผ๊ฐ ์งํ๋๋ ํ๊ธ์ฑ๋ฆฐ์ง๋ก ์๊ฐ๋ฃ 100% ํ๊ธ๋ฐ์ผ์ธ์! ๋ ๋ฆ๊ธฐ์ ์ ์๊ธฐ๊ณ๋ฐ ๋ง์ฐจ ํ์น!
fastcampus.co.kr
๋ณธ ํฌ์คํ ์ ํจ์คํธ์บ ํผ์ค ํ๊ธ ์ฑ๋ฆฐ์ง ์ฐธ์ฌ๋ฅผ ์ํด ์์ฑ๋์์ต๋๋ค.
728x90๋ฐ์ํ'๐ STUDY > FASTCAMPUS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํจ์คํธ์บ ํผ์ค ์ฑ๋ฆฐ์ง 5์ผ์ฐจ (0) 2021.11.05 ํจ์คํธ์บ ํผ์ค ์ฑ๋ฆฐ์ง 4์ผ์ฐจ (0) 2021.11.04 ํจ์คํธ์บ ํผ์ค ์ฑ๋ฆฐ์ง 3์ผ์ฐจ (0) 2021.11.03 ํจ์คํธ์บ ํผ์ค ์ฑ๋ฆฐ์ง 1์ผ์ฐจ (0) 2021.11.01 [FASTCAMPUS] ๊ฐ์์ด๊ธฐ 30์ผ 100% ํ๊ธ ์ฑ๋ฆฐ์ง (0) 2021.11.01 ๋๊ธ