프로그래머스 문제
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 구문
이 문제의 핵심은 GENERATION을 어떻게 출력하느냐 인 것 같다.
재귀문 사용 외에도 다른 방법이 물론 있겠지만, 아직 생각해보지 않아서 그것까진 잘 모르겠다.
'코딩테스트 > SQL - 프로그래머스' 카테고리의 다른 글
SQL 고득점 kit(String, Date) - 오랜 기간 보호한 동물(2) (1) | 2024.04.07 |
---|---|
SQL 고득점 kit(String, Date) - 조건에 맞는 사용자 정보 조회하기 (0) | 2024.04.04 |
SQL 고득점 kit(String, Date) - 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 (0) | 2024.04.02 |
연도별 대장균 크기의 편차 구하기 (0) | 2024.03.30 |
우유와 요거트가 담긴 장바구니 (0) | 2024.03.30 |