Algorithm/Programmers SQL

[MySQL] 프로그래머스 특정 세대의 대장균 찾기

제우제우 2024. 9. 17. 14:25

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코딩테스트 연습 > SELECT > 특정 세대의 대장균 찾기

 

문제 분석

난이도: LEVEL4

 

문제 요구사항

3세대의 대장균의 ID(ID) 를 출력하는 SQL 문을 작성해주세요. 

이때 결과는 대장균의 ID 에 대해 오름차순 정렬해주세요.

 

1세대: PARENT_ID IS NULL

2세대: 1세대를 PARENT_ID로 갖는 대장균

3세대: 2세대를 PARENT_ID로 갖는 대장균 

 

정답 코드1

WITH FIRST_CTE AS (
    SELECT ID 
    FROM ECOLI_DATA
    WHERE PARENT_ID IS NULL
),
SECOND_CTE AS (
    SELECT ID 
    FROM ECOLI_DATA
    WHERE PARENT_ID IN (SELECT * FROM FIRST_CTE)
)
SELECT ID 
FROM ECOLI_DATA
WHERE PARENT_ID IN (SELECT * FROM SECOND_CTE)
ORDER BY 1

 

CTE를 활용한 바닐라(노가다) 쿼리 

 

정답 코드2

WITH RECURSIVE CTE AS (
    SELECT ID, 1 GENERATION -- 1세대 
    FROM ECOLI_DATA
    WHERE PARENT_ID IS NULL 
    
    UNION ALL 
    
    SELECT D.ID, C.GENERATION + 1 -- 세대 추가 
    FROM ECOLI_DATA D JOIN CTE C
    ON D.PARENT_ID = C.ID
)
SELECT ID 
FROM CTE 
WHERE GENERATION = 3 
ORDER BY 1

 

재귀 CTE(Recursive CTE) 활용

 

PARENT_ID 가 NULL인 1세대를 찾고 GENERATION 컬럼을 추가하면서 1로 설정한다. 

재귀적으로 CTE를 돌리면서 이전 세대의 ID를 PARENT_ID로 갖는 데이터를 찾고 이전 세대에서 1 추가한다.

재귀 CTE가 끝나면(더이상 세대 매칭 불가능)

 

재귀 CTE에서 3세대인 ID를 찾는다.