본문 바로가기

코딩테스트/SQL - 프로그래머스

SQL 고득점 kit(SELECT) - 멸종위기의 대장균 찾기

 

프로그래머스 문제

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

 

풀이

https://school.programmers.co.kr/questions/75058

 

 

 

 

 

-- 풀이 쿼리

-- 각 세대별 자식 없는 개체 수(COUNT)와 그 세대(GENERATION)를 출력
-- 세대에 대해 오름차순 정렬.
-- 각 세대별 자식 없는 개체가 적어도 1개체는 존재함

-- 부모 없는 세대 -> 1세대
-- 1세대가 부모인 세대 -> 2세대
-- 2세대가 부모인 세대 -> 3세대
-- ...  => 재귀문 사용!   

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

SELECT COUNT(ID) AS COUNT
     , GENERATION
    FROM GEN_NO_CHILDREN
    GROUP BY GENERATION
    ORDER BY GENERATION;

 

 

오랜만에 본 Lv5 문제

어려웠다.

 

 

재귀문을 쓸 줄 몰랐다면 풀기 정말 어려웠을 것 같다

하지만 지난 번 프로그래머스에서 문제를 풀 때 재귀문을 한번 접한 덕에, 관련해서 포스팅을 한 적이 있어 기억이 났다.

 

재귀문을 어떻게 사용하는지 모른다면, 아래 포스팅을 참고하도록 하자.

[STUDY/SQL, DB] - [MySQL] WITH RECURSIVE 구문

 

[MySQL] WITH RECURSIVE 구문

SQL에서 재귀 쿼리 짤 때 사용하는 구문이다. 구문 작성하는 방법이 좀 독특한데, 아래와 같다. WITH RECURSIVE cte_count AS ( -- Non-Recursive 문장( 첫번째 루프에서만 실행됨 ) SELECT 1 AS n UNION ALL -- Recursive

k-wien1589.tistory.com

 

 

 

이 문제의 핵심은 GENERATION을 어떻게 출력하느냐 인 것 같다.

 

재귀문 사용 외에도 다른 방법이 물론 있겠지만, 아직 생각해보지 않아서 그것까진 잘 모르겠다.