PRACTICE/SQL

[MySQL] 4단계 14. 특정 세대의 대장균 찾기

j1ngerhead 2025. 2. 10. 17:09

 

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/301650

WITH RECURSIVE ECOLI_GENERATIONS AS (
    -- 1. 1세대(기본 세대) 대장균을 초기 설정
    SELECT ID, PARENT_ID, 1 AS GENERATION
    FROM ECOLI_DATA
    WHERE PARENT_ID IS NULL
    
    UNION ALL
    
    -- 2. 재귀적으로 각 세대 자손을 추가
    SELECT E.ID, E.PARENT_ID, EG.GENERATION + 1 AS GENERATION
    FROM ECOLI_DATA E
    JOIN ECOLI_GENERATIONS EG ON E.PARENT_ID = EG.ID
)

-- 3. 3세대 필터링 및 정렬
SELECT ID
FROM ECOLI_GENERATIONS
WHERE GENERATION = 3
ORDER BY ID;


3세대의 대장균 ID만 추출하려면 각 대장균의 세대를 계산해야 한다. 
재귀적 CTE(Common Table Expressions) 활용
SQL에서 재귀적 CTE는 한 레코드의 부모-자식 관계를 통해 트리 구조로 데이터를 조회할 때 적합하다. 
+ 복잡한 관계형 데이터를 다룰 때 강력한 기능이다.

재귀적 CTE를 설정하고, 각 ID의 세대를 계산한다.
재귀 조건: PARENT_ID가 NULL인 대장균(1세대)을 먼저 선택한 뒤, 
이들을 부모로 갖는 대장균을 찾아 세대를 증가시키며 연결한다.
트리 구조를 따라가며 원하는 세대를 필터링하는 데 효과적이다.

💡 접근 방식 요약
1. 기본 세대를 설정하고, PARENT_ID가 NULL인 대장균(1세대)부터 시작한다.
2. 재귀적으로 부모를 따라가며 자식 ID와 세대를 갱신해 나간다.
3. 최종적으로 3세대만 필터링해 출력한다.

 

 

320x100