문제풀이/SQL

select Lv5. 멸종위기의 대장균 찾기

monawa 2025. 8. 4.
728x90

문제 

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

풀이 

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

SELECT  
    COUNT(*) AS COUNT,
    GEN AS GENERATION
FROM GEN 

WHERE ID NOT IN ( 
    SELECT PARENT_ID
    FROM ECOLI_DATA
    WHERE PARENT_ID IS NOT NULL
)

GROUP BY GEN 
ORDER BY GEN

 

 

첨엔 

with as 1 ( 
    select id
    from ECOLI_DATA  
    where PARENT_ID is null
)
with as 2  
    (select id
    from ECOLI_DATA  
    where PARENT_ID = 1. id)

세대별로 하드코딩중이였는데 이건 아닌거 같아서 찾아보니 재귀 쿼리를 이용하면 된다 

재귀란 함수를 반복문 처럼 종료조건까지 자기자신을 호출해 반복해서 처리해주는것 

WITH RECURSIVE <임시_테이블_이름>(컬럼1, 컬럼2, ...) AS (
    -- 1. 앵커 멤버 (Anchor Member): 재귀의 시작점
    SELECT ...
    FROM ...
    WHERE <시작_조건>

    UNION ALL

    -- 2. 재귀 멤버 (Recursive Member): 반복될 부분
    SELECT ...
    FROM <원본_테이블>
    INNER JOIN <임시_테이블_이름> ON <연결_조건> -- 자기 자신을 다시 참조
)

-- 3. 최종 쿼리: 위에서 만든 임시 테이블을 사용
SELECT * FROM <임시_테이블_이름>;

이런 형식이다  시작점 잡고 그후 쿼리가 조건이 충족되는한 게속 반복 

728x90

댓글