๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
HYU/์กธ์—… ํ”„๋กœ์ ํŠธ

6. ๋…ธ๋“œ ์‚ญ์ œ ๋ฐ ๊ฐ„์„  ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ฐœ์„ 

by Jaeguk 2024. 3. 17.

์ด์ „ ๋ฏธํŒ… ํ”ผ๋“œ๋ฐฑ


์ด์ „ ๋ฏธํŒ…์—์„œ ๋ฐ›์€ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ธฐ๋Šฅ ๊ฐœ์„ 

  • ๋…ธ๋“œ ์‚ญ์ œ์‹œ ์ด์›ƒ ๋…ธ๋“œ๋„ ํ•จ๊ป˜ ์‚ญ์ œํ•  ๊ฒƒ์ธ์ง€ ์—ฌ๋ถ€ ์„ ํƒ ๊ฐ€๋Šฅ
  • ์„œ๋กœ ๋‹ค๋ฅธ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ„ ๊ฐ„์„  ์ถ”๊ฐ€์‹œ ์ƒ‰์ƒ ๋ณ€๊ฒฝ
  • Union-Find ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ฑ๋Šฅ ๊ฐœ์„ 

 

ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜

1. ์ด์›ƒ ๋…ธ๋“œ ์‚ญ์ œ ์—ฌ๋ถ€ ๊ฒฐ์ •

ํŠน์ • ๋…ธ๋“œ ์‚ญ์ œ์‹œ ํ•ด๋‹น ๋…ธ๋“œ์™€ ์ด์›ƒํ•œ ๋…ธ๋“œ๋ฅผ ํ•จ๊ป˜ ์‚ญ์ œํ• ์ง€ ์„ ํƒ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ฐœ์„ 

const handleSubmit = useCallback(() => {
    if (filter === "") {
      return;
    }

    setRerender(false);

    setGraphData((prev) => {
      let filteredNodes = prev.nodes;
      let filteredEdges = prev.edges;

      if (deleteNeighbor) {
        filteredEdges = prev.edges.filter(
          (edge) => !edge.data.filter?.includes(filter)
        );
        // ์ด์›ƒ๊ณผ ํ•จ๊ป˜ ์‚ญ์ œ
        filteredNodes = prev.nodes.filter((node) =>
          filteredEdges.some(
            (edge) =>
              edge.data.source === node.data.id ||
              edge.data.target === node.data.id
          )
        );
      } else {
        // ์ด์›ƒํ•œ ๋…ธ๋“œ๋Š” ์‚ญ์ œํ•˜์ง€ ์•Š์Œ
        filteredNodes = prev.nodes.filter((node) => node.data.id !== filter);
      }

      return {
        nodes: filteredNodes,
        edges: filteredEdges,
      };
    });

    setFilter("");
  }, [filter, setGraphData, deleteNeighbor]);
  • deleteNeighbor์ด๋ผ๋Š” ์ƒํƒœ๊ฐ’์„ ๋‘์–ด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋– ํ•œ ์˜ต์…˜์„ ์„ ํƒํ–ˆ๋Š”์ง€ ๊ตฌ๋ถ„
    • ์ด์›ƒ๊ณผ ํ•จ๊ป˜ ์‚ญ์ œํ•  ๊ฒฝ์šฐ์—๋Š” ๊ฐ„์„ ์„ ํ†ตํ•ด ์ด์›ƒ์˜ ์ •๋ณด๋ฅผ ์ฐพ์•„์„œ ํ•จ๊ป˜ ์‚ญ์ œ
    • ์ด์›ƒ์€ ์‚ญ์ œํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, filter ๊ฐ’์— ๊ฑธ๋ฆฌ๋Š” ๋…ธ๋“œ๋งŒ ์‚ญ์ œ

 

๋…ธ๋“œ ์‚ญ์ œ ์˜ต์…˜

 

2. ๊ฐ„์„  ์ถ”๊ฐ€์‹œ ํด๋Ÿฌ์Šคํ„ฐ ์ƒ‰์ƒ ๋ณ€๊ฒฝ

์ง€๋‚œ๋ฒˆ์—๋Š” ๊ฐ„์„ ์ด ์ถ”๊ฐ€๋˜์–ด ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๊ฒฐํ•ฉ๋˜์–ด๋„ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ƒ‰์ƒ์ด ํ†ต์ผ๋˜์ง€ ์•Š์•˜์—ˆ๋‹ค

   useEffect(() => {
    if (myCyRef) {
      graphData.nodes.forEach((node) => {
        myCyRef.getElementById(node?.data?.id ?? strings.empty).style({
          "background-color": node?.data?.color,
        });
      });
      myCyRef?.style(styleSheet).update();
    }
  }, [layout, graphData]);
  • ๊ฐ„์„ ์ด ์ถ”๊ฐ€๋˜๋ฉด ๋‹ค์‹œ ๋…ธ๋“œ๋“ค์„ ๋Œ๋ฉด์„œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ฐพ์•„ ์ƒ‰์ƒ์„ ์ง€์ •ํ•ด์ฃผ์—ˆ๋‹ค
  • ๊ทธ๋ฆฌ๊ณ  ์ง€์ •๋œ ์ƒ‰์ƒ์„ ๋ฐ”ํƒ•์œผ๋กœ style() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ƒ‰์ƒ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋‹ค
  • ์ด์ „์—๋Š” ์ง์ ‘ style์„ ๋ณ€๊ฒฝ์„ ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ‰์ƒ์ด ๋ฐ”๋€Œ์ง€ ์•Š์•˜์—ˆ๋‹ค

๊ฐ„์„  ์ถ”๊ฐ€

 

3. Union-Find ์„ฑ๋Šฅ ๊ฐœ์„ 

์ง€๋‚œ๋ฒˆ์— ๊ฒฐํ•ฉ๋œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ํƒ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Union-Find๋ฅผ ๋‹ค์‹œ ๋Œ์•„์•ผ ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์งˆ๋ฌธ์„ ๋“œ๋ ธ์—ˆ๋‹ค

  • Map<String, List>์™€ ๊ฐ™์€ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ, ๊ฐ ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค
  • ๋ฌธ์ œ๋Š” Cytoscape์˜ Node๋ฅผ ํ†ต์งธ๋กœ List์— ๋„ฃ๊ธฐ์—” ๋ฌด๋ฆฌ๊ฐ€ ์žˆ์—ˆ๋‹ค.
  • ๊ทธ๋ ‡๋‹ค๊ณ  ID ๊ฐ’๋งŒ String์œผ๋กœ ์ €์žฅ์„ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด, ๋ Œ๋”๋ง์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์‹œ Node๋กœ ๋ณ€๊ฒฝ์„ ํ•ด์ฃผ์–ด์•ผ ํ–ˆ๋‹ค.
  • ์ด๋Ÿฐ ๊ณผ์ •์„ ๊ฑฐ์น ๋งŒํผ ๋ Œ๋”๋ง ์†๋„๊ฐ€ ๋Š๋ฆฌ์ง€ ์•Š์•„์„œ, ์ผ๋‹จ์€ ๊ทธ๋Œ€๋กœ ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

์ƒˆ๋กญ๊ฒŒ ๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ


ํ•„์š”ํ•˜๋‹ค๊ณ  ๋Š๋‚€ ๊ธฐ๋Šฅ์„ ์ƒˆ๋กญ๊ฒŒ ๊ตฌํ˜„

 

1. ๋…ธ๋“œ ๊ฒ€์ƒ‰

๋…ธ๋“œ์˜ ์ˆ˜๊ฐ€ ๋งŽ์•„์กŒ์„ ๋•Œ, ํŠน์ • ๋…ธ๋“œ์˜ ์œ„์น˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ์–ด๋ ค์›Œ์„œ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ๋„์ž…ํ–ˆ๋‹ค

  useEffect(() => {
    if (!myCyRef) return;
    const elements = myCyRef.elements(`node[label = "${searchNode}"]`);
    if (elements && elements.length > 0) {
      myCyRef?.animate({
        fit: {
          eles: elements,
          padding: 20,
        },
      });
      myCyRef?.center(elements);
    }
  }, [searchNode]);
  • ๊ฒ€์ƒ‰์–ด์— ๋”ฐ๋ผ์„œ ํ•ด๋‹น ๊ฒ€์ƒ‰์–ด์™€ ์ผ์น˜ํ•˜๋Š” ID๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ๋ฅผ ํ™•๋Œ€ํ•ด์„œ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.

 

๋…ธ๋“œ ๊ฒ€์ƒ‰

 

ํ”ผ๋“œ๋ฐฑ


์ด๋ฒˆ์— ๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ๋“ค์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•˜๋‹ค

  • ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์€ ์ข‹์ง€๋งŒ, ๋„คํŠธ์›Œํฌ ๋‚ด์—์„œ ์–ด๋””์— ์œ„์น˜ํ•˜๋Š”์ง€๋ฅผ ์•Œ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ™•๋Œ€ ๋ณด๋‹ค๋Š” ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๊นœ๋นก์ด๊ฒŒ ํ•˜๋Š” ๋“ฑ์˜ ์ดํŽ™ํŠธ๊ฐ€ ๋” ์ข‹์•„ ๋ณด์ธ๋‹ค
    • ์ด์œ ๋ฅผ ๋“ฃ๊ณ  ๋ฐ”๋กœ ๋‚ฉ๋“ํ–ˆ๋˜ ํ”ผ๋“œ๋ฐฑ์ด์—ˆ๋‹ค
  • ํŠน์ • ๋…ธ๋“œ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ด๋”˜๊ฐ€์— ๋„์›Œ์ค„ ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค

 

์ถ”ํ›„ ๊ณ„ํš


๋‹ค์Œ๋ฒˆ์—๋Š” ์–ด๋–ค ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„ํ• ์ง€ ๋…ผ์˜

  • ๋จผ์ € ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กญ๊ฒŒ ๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ๊ฐœ์„ ํ•  ์˜ˆ์ •
  • ์›๊ฒฉ์œผ๋กœ ์ ‘์†ํ•˜๊ธฐ ์ „์— ์—ฐ๊ตฌ์‹ค์— ๋ฐฉ๋ฌธํ•ด์„œ ์„œ๋ฒ„ ์ปดํ“จํ„ฐ์— ๊ธฐ๋ณธ์ ์ธ ์„ธํŒ…์„ ํ•  ์˜ˆ์ •
728x90