[SQL] 특정 세대의 대장균 찾기

Ray·2025년 6월 11일

SQL

목록 보기
39/39

🔎 문제설명

  • 출처: 프로그래머스
  • 사용언어(RDBMS): SQL(MySQL)
  • 문제:

    3세대의 대장균의 ID(ID) 를 출력하는 SQL 문을 작성해주세요. 이때 결과는 대장균의 ID 에 대해 오름차순 정렬해주세요.




✅ 제출답안

# 재귀CTE를 사용하지 않은 방법
# 테이블 별로 ID의 의미: ONE이 1세대, TWO가 2세대, THREE가 3세대
SELECT THREE.ID
FROM ECOLI_DATA AS ONE 
    JOIN ECOLI_DATA AS TWO ON (ONE.ID = TWO.PARENT_ID AND ONE.PARENT_ID IS NULL)
    JOIN ECOLI_DATA AS THREE ON TWO.ID = THREE.PARENT_ID
ORDER BY 1;
# 재귀CTE를 사용한 답안
WITH RECURSIVE GEN_E AS (
	# 1세대 대장균
    SELECT ID, 1 AS GEN
    FROM ECOLI_DATA 
    WHERE PARENT_ID IS NULL
    
    UNION ALL
    # 2세대부터의 대장균
    SELECT E.ID, GEN + 1
    FROM ECOLI_DATA E INNER JOIN GEN_E P ON E.PARENT_ID = P.ID
)
SELECT ID
FROM GEN_E
WHERE GEN = 3       # 3세대의 대장균만 추출
ORDER BY 1;



🚀 풀이기록

3세대의 대장균을 추출하는 문제여서 JOIN을 두 번 사용하면 풀 수 있는 문제였다. 그런데 문제의 의도는 재귀CTE를 사용하는 것 같아, 이후에 다시 문제를 풀었을 때는 재귀CTE방법을 사용했다.

주의할 점

  • 1세대 대장균을 추출할 때 PARENT_IDNULL이라는 조건을 걸어주는 걸 잊지 말아야 한다. 그래야 2세대, 3세대 대장균도 제대로 추출할 수 있다!

재귀CTE

  • 재귀CTE를 사용하여 전 세대의 대장균을 추출했다.
  • 몇 세대인지 표시하기 위해 GEN컬럼에 몇 세대인지 표시하게 했다.
WITH RECURSIVE GEN_E AS (
	# 1세대 대장균
    SELECT ID, 1 AS GEN
    FROM ECOLI_DATA 
    WHERE PARENT_ID IS NULL
    
    UNION ALL
    # 2세대부터의 대장균
    SELECT E.ID, GEN + 1
    FROM ECOLI_DATA E INNER JOIN GEN_E P ON E.PARENT_ID = P.ID
)

이후 WHERE에 조건을 걸어 3세대 대장균만 추출한 뒤, ID로 오름차순 정렬을 했다.

SELECT ID
FROM GEN_E
WHERE GEN = 3       # 3세대의 대장균만 추출
ORDER BY 1;

처음에는 코드에 자세한 설명을 쓰려다가, 생각해보니 이 부분은 익숙해져야 하는 부분이라 간단히 메모만 해놓았다. 설명을 써놓는 것보다 나중에 다시 문제를 풀게 될 때 코드를 따라쓰는게 더 도움이 될 거 같다.

profile
미래의 독자인 나를 위해 글을 씁니다.

0개의 댓글