코딩테스트

[26.02.26 코테(MySQL)]-멸종위기의 대장균 찾기

지니248 2026. 2. 26. 17:30

Lv5. 멸종위기의 대장균 찾기 (MySQL)

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

 

내가 작성한 코드

-- 재귀 쿼리 시작 : 모든 개체의 세대(GENERATION) 계산
WITH RECURSIVE GENERATIONS AS (
    -- 가장 뿌리가 되는 1세대를 먼저 찾음
    SELECT ID, PARENT_ID, 1 AS GENERATION -- 부모가 없는 대체는 무조건 1세대로 설정 
    FROM ECOLI_DATA
    WHERE PARENT_ID IS NULL
                               
    UNION ALL -- 아래의 쿼리 결과를 합침(중복 포함)
                               
    SELECT E.ID, E.PARENT_ID, G.GENERATION + 1 -- 부모 세대 번호에 1을 더해 현재 세대를 구함
    FROM ECOLI_DATA E -- 원본 데이터(자식 후보)
    JOIN GENERATIONS G -- 이전 단계에서 찾아낸 부모 세대 데이터
      ON E.PARENT_ID = G.ID
)
-- 세대 정보를 바탕으로 조건에 맞는 개체만 집계
SELECT COUNT(*) AS COUNT, GENERATION
FROM GENERATIONS
-- 자식이 없는 개체만 골라냄, 부모 ID목록에 내 ID가 존재하지 않는다면 자식이 없는 개체임
WHERE ID NOT IN (SELECT DISTINCT PARENT_ID
                 FROM ECOLI_DATA
                 WHERE PARENT_ID IS NOT NULL) -- NULL값을 제외해야 NOT IN 연산이 제대로 동작함
GROUP BY GENERATION
ORDER BY GENERATION;

 

재귀 쿼리에 대해 새로 배우는 계기가 되었다

재귀 쿼리의 구조

WITH RECURSIVE 테이블명 AS (
    -- Anchor: 비재귀 부분 (시작점)
    SELECT 컬럼1, 컬럼2, 초기값 AS 레벨
    FROM 원본테이블
    WHERE 시작조건

    UNION ALL

    -- Recursive: 재귀 부분 (반복 규칙)
    SELECT T.컬럼1, T.컬럼2, R.레벨 + 1
    FROM 원본테이블 T
    INNER JOIN 테이블명 R ON T.부모컬럼 = R.자식컬럼 -- 자기 자신과 조인
)
-- 실행 부분 (최종 결과 조회)
SELECT * FROM 테이블명;