Graph

Icarus<Wing>ยท2025๋…„ 5์›” 5์ผ

๐Ÿ”–๊ทธ๋ž˜ํ”„: ์ •์ (vertex)๋“ค์˜ ์ง‘ํ•ฉ V์™€ ์ด๋“ค์„ ์—ฐ๊ฒฐ ํ•˜๋Š” ๊ฐ„์„ (edge)๋“ค์˜ ์ง‘ํ•ฉ E๋กœ ๊ตฌ์„ฑ๋œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งํ•˜๋ฉฐ, G=(V,E)G = (V, E)๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

๐Ÿ“ข์—ฌ๊ธฐ์„œ ์ž ๊น! ๊ทธ๋ž˜ํ”„์˜ ์ข…๋ฅ˜๋ฅผ ํ•™์Šตํ•˜๊ธฐ ์ „์—, ์ด์ „ ์‹œ๊ฐ„์— ๋ฐฐ์šด ํŠธ๋ฆฌ์™€ ๊ทธ๋ž˜ํ”„์˜ ์ฐจ์ด์ ์„ ์•Œ์•„๋ณด์ž.

ํŠธ๋ฆฌ๋„ ๊ทธ๋ž˜ํ”„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ •์ (Node)์™€ ๊ฐ„์„ (Edge)๊ฐ€ ์žˆ์ง€๋งŒ, ๊นŠ์ด(depth)๊ฐ€ ์žˆ์–ด ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค๋Š” ์ ์—์„œ ๊ทธ๋ž˜ํ”„์™€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.
base condition์˜ ์—ญํ• : ํŠธ๋ฆฌ๋Š” ๊ตฌ์กฐ์ ์œผ๋กœ ์‚ฌ์ดํด์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— if (root == null) return null;๊ณผ ๊ฐ™์€ ์ฒดํฌ๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜์ง€๋งŒ, ๊ทธ๋ž˜ํ”„๋Š” ๋ณดํ†ต ๋ฌดํ–ฅ ๊ทธ๋ž˜ํ”„(undirected graph)๋กœ ์ฃผ์–ด์ ธ ์‚ฌ์ดํด์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ํ™•์ธ์ด base condition์˜ ์—ญํ• ์„ ํ•œ๋‹ค.

๊ทธ๋ž˜ํ”„์˜ ์ข…๋ฅ˜

๐Ÿ”–๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„(Directed graph): ๋“ค์–ด์˜ค๋Š” edge์™€ ๋‚˜๊ฐ€๋Š” edge๊ฐ€ ๋”ฐ๋กœ ์ •ํ•ด์ ธ์žˆ๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ์˜๋ฏธํ•จ

๐Ÿ”–indegree: ํ•˜๋‚˜์˜ ์ •์ ์— ๋“ค์–ด์˜ค๋Š” edge
๐Ÿ”–outdegree: ํ•˜๋‚˜์˜ ์ •์ ์—์„œ ๋‚˜๊ฐ€๋Š” edge

๐Ÿ”–๋ฌดํ–ฅ ๊ทธ๋ž˜ํ”„(Undirected graph): ๋ฐฉํ–ฅ์ด ์•ˆ ์ •ํ•ด์ ธ ์žˆ์–ด ๋‘ ์ •์  ๊ฐ„์— edge๋กœ ์—ฐ๊ฒฐ์ด ๋˜์–ด์žˆ์œผ๋ฉด V -> W ๋˜๋Š” W -> V๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ์˜๋ฏธํ•จ

๐Ÿ”–simple graph: ๋‘ ์ •์ ๊ฐ„์— edge๊ฐ€ 1๊ฐœ๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š” ๊ทธ๋ž˜ํ”„
๐Ÿ”–๋‹ค์ค‘๊ทธ๋ž˜ํ”„: ์ธ์ ‘ํ•ด์žˆ๋Š” ๋‘ ์ •์  ์‚ฌ์ด์— outdegree์™€ indegree๊ฐ€ 2๊ฐœ ์ด์ƒ์ธ ๊ทธ๋ž˜ํ”„

๐Ÿ“ข์ฝ”ํ…Œ์—์„œ๋Š” Undirected graph์™€ simple graph๋ฅผ ์ฃผ๋กœ ๋‹ค๋ฃธ!

๐Ÿ”–๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„: ๊ฐ ๊ฒฝ๋กœ(edge)๋งˆ๋‹ค ๊ฐ€์ค‘์น˜(๋น„์šฉ ๋˜๋Š” ์‹œ๊ฐ„)๊ฐ€ ๋‹ค๋ฅธ ๊ทธ๋ž˜ํ”„

๐Ÿ“ข๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์ฃผ๋กœ ์“ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ถ”ํ›„ ์‹ฌํ™”ํŽธ์—์„œ ๋‹ค๋ฃฐ ์˜ˆ์ •์ž„

๊ทธ๋ž˜ํ”„์˜ ๊ตฌํ˜„

๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์ธ์ ‘ ํ–‰๋ ฌ, ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ, ๊ทธ๋ฆฌ๊ณ  ์•”์‹œ์  ๊ทธ๋ž˜ํ”„๋กœ ์ด 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

์ธ์ ‘ ํ–‰๋ ฌ

row์™€ column์— ๋”ฐ๋ผ, ์ฆ‰ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์„ ๋งํ•œ๋‹ค.

์œ„์™€ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„๋ฅผ ํ–‰๋ ฌ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๐Ÿ‘‡

  • ์ธ์ ‘ ํ–‰๋ ฌ์˜ ํŠน์ง•์€ ๋Œ€๊ฐ ์„ฑ๋ถ„์„ ๊ธฐ์ค€์œผ๋กœ ๋Œ€์นญ์„ฑ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.(โˆตundirected graph)
    • ์ž๊ธฐ ์ž์‹ ์„ ์—ฐ๊ฒฐํ•˜๋Š” edge๋Š” ์กด์žฌํ•˜์ง€ ์•Š์•„์„œ ๋Œ€๊ฐ ์„ฑ๋ถ„์€ ๋ชจ๋‘ 0์ด๋‹ค.
  • ๊ฐ ์ •์ ๋“ค์„ row์™€ column์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ณ , edge๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด 1, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿšฉ๊ทธ๋Ÿฐ๋ฐ, ์ธ์ ‘ ํ–‰๋ ฌ์€ ์œ„์™€ ๊ฐ™์ด ์ •์ ์€ ๋งŽ์€๋ฐ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์„ ๋•Œ๋Š” 0์˜ ๊ฐ’๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ ์ด๋‹ค.

๐Ÿ”จ๋”ฐ๋ผ์„œ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ ์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์ธ์ ‘ ๋ฆฌ์ŠคํŠธ

ํ•ด์‹œ๋งต์˜ ํ˜•ํƒœ๋กœ ์ •์˜๋˜๊ณ , Key๋Š” ์ •์ ๋“ค์ด ๋“ค์–ด๊ฐ€๊ณ , Value์—๋Š” list ํ˜•ํƒœ๋กœ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ํ‘œ์‹œํ•ด์ค€๋‹ค.

์œ„์˜ ๊ทธ๋ž˜ํ”„๋ฅผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

public class GraphSort {
    public static void main(String[] args) {
        HashMap<String, List<String>> graph = new HashMap<>();
        graph.put("A", List.of("B"));
        graph.put("B", List.of("A", "C", "E"));
        graph.put("C", List.of("B", "D"));
        graph.put("D", List.of("C", "E", "F"));
        graph.put("E", List.of("B", "D", "F"));
        graph.put("F", List.of("D", "E"));

        System.out.println(graph);
    }
}
  • ๐Ÿ’ก์ž๋ฐ”9 ์ด์ƒ๋ถ€ํ„ฐ ์‚ฌ์šฉ๋˜๋Š” List.of()๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์›์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ถˆ๋ณ€ ๋ฆฌ์ŠคํŠธ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
    • ์–˜๋Š” ImmutableCollections ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฃผ์ž…ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•จ

์•”์‹œ์  ๊ทธ๋ž˜ํ”„

๋ณดํ†ต, ๋ฏธ๋กœ ๋ฌธ์ œ๊ฐ€ ๋‚˜์˜ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ทธ๋ž˜ํ”„๋ฅผ ์•”์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฒ€์€์ƒ‰์ด ๋ฒฝ์ด๊ณ  ํฐ ์ƒ‰์ด ๊ธธ์ธ๋ฐ, ๋ฒฝ์„ 1๋กœ ๊ธธ์„ 0์œผ๋กœ ํ‘œํ˜„ํ•จ์œผ๋กœ์จ ๊ตฌ๋ถ„ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๊ฐ ์˜์—ญ์— ์ขŒํ‘œ ๊ฐœ๋…์„ ๋„์ž…ํ•˜์—ฌ row์™€ col๋กœ ์ธ์ ‘ ํ–‰๋ ฌ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

public class GraphSort {
    public static void main(String[] args) {
        int[][] maze = {
                {1, 1, 1, 1, 1},
                {0, 0, 0, 1, 1},
                {1, 1, 0, 1, 1},
                {1, 0, 0, 0, 0},
                {1, 1, 1, 1, 1}
        };
        
        System.out.println(maze[2][1]);
    }
}

๋งŒ์•ฝ, (2, 1)์— ์ ‘๊ทผํ•˜๊ณ  ์‹ถ์œผ๋ฉด, maze[2][1]๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

profile
๋ชจ๋“  ์ฝ”๋“œ์—๋Š” ์ด์œ ๊ฐ€ ์žˆ๊ธฐ์— ์›์ธ์„ ํŒŒ์•…ํ•  ๋•Œ๊นŒ์ง€ ์ง‘์š”ํ•˜๊ฒŒ ํƒ๊ตฌํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€