알고리즘/SQL

[PROJ] LV5 멸종위기의 대장균 찾기 (MySQL)

세동세 2024. 10. 17. 17:54

문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

WITH RECURSIVE 문

https://www.mysqltutorial.org/mysql-basics/mysql-recursive-cte/

 

MySQL Recursive CTE

In this tutorial, you will learn about MySQL recursive CTE and how to use it to traverse hierarchical data in the MySQL database.

www.mysqltutorial.org

 

아래 코드는 WITH RECURSIVE 절을 이해하기 쉽도록 대표적인 예제를 만들어둔 것이다.

WITH RECURSIVE CNT 
AS (
    SELECT 1 AS n 
    UNION ALL
    SELECT n + 1 AS num
    FROM CNT
    WHERE n < 5
)

SELECT * FROM CNT;

 

 

 

초기값을 설정하고, 위 쿼리와 아래 쿼리 값을 연산한 후 WHERE절로 조건 처리를 한다.

 

따라서 이 문제에서는 GEN을 구해야하는 데, PARENT_ID를 타고 세대를 찾아야한다.

WITH RECURSIVE GENERATION AS (

-- 초기값 설정 : 만약 PARENT_ID가 없으면 1로 둔 초기값으로 설정
    SELECT ID, PARENT_ID, 1 AS GEN
    FROM ECOLI_DATA
    WHERE PARENT_ID IS NULL
    
    UNION ALL 
    
    SELECT E.ID, E.PARENT_ID, GEN + 1 AS GEN
    FROM ECOLI_DATA E
    JOIN GENERATION G
    ON E.PARENT_ID = G.ID
)

 

코드

-- 재귀 사용

# (ID, 부모 ID, N세대)

WITH RECURSIVE GENERATION AS (
    SELECT ID, PARENT_ID, 1 AS GEN
    FROM ECOLI_DATA
    WHERE PARENT_ID IS NULL
    
    UNION ALL 
    
    SELECT E.ID, E.PARENT_ID, GEN + 1 AS GEN
    FROM ECOLI_DATA E
    JOIN GENERATION G
    ON E.PARENT_ID = G.ID
)

SELECT COUNT(*) AS COUNT, GEN AS GENERATION
FROM GENERATION
WHERE ID 
    NOT IN (
        SELECT DISTINCT PARENT_ID
        FROM GENERATION 
        WHERE PARENT_ID IS NOT NULL
    )
GROUP BY GEN;