알고리즘/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;