코딩테스트 연습 - 특정 세대의 대장균 찾기
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/301650
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 설명

대장균이 분화하며 자식 대장균을 생성하는데 3세대 대장균을 구하는 문제이다.
문제 풀이
생각 과정
1. 직관적으로 서브쿼리를 사용해서 구할 수 있다고 생각했고
2. JOIN문으로 다시 한번 쿼리를 작성해봤다.
3. 아무리 생각해도 LEVEL4의 난이도가 아닌거 같아 다른 풀이를 보니 재귀를 사용한 방법이 있어서 공부해봤다.
구현
1. 서브쿼리
SELECT ID FROM ECOLI_DATA WHERE PARENT_ID IN
(SELECT ID FROM ECOLI_DATA WHERE PARENT_ID IN
(SELECT ID FROM ECOLI_DATA WHERE PARENT_ID IS NULL)
)
ORDER BY ID ASC;
2. JOIN
SELECT e1.ID FROM ECOLI_DATA e1
JOIN ECOLI_DATA e2 ON e1.PARENT_ID = e2.ID
JOIN ECOLI_DATA e3 ON e2.PARENT_ID = e3.ID
WHERE
e3.PARENT_ID IS NULL
ORDER BY e1.ID ASC;
3. CTE( Common Table Expression )
-- WITH RECURSIVE: 자기 자신을 참조하는 CTE 정의. 트리 구조를 탐색할 때 자주 씀.
WITH RECURSIVE ECOLI_TREE AS (
-- 기본 (Non-Recursive) 파트
SELECT
ID,
PARENT_ID,
1 GENERATION -- 세대(GENERATION)는 1로 시작함.
FROM
ECOLI_DATA
WHERE
PARENT_ID IS NULL -- 최상위 노드 (루트 노드)를 찾음.
UNION ALL
-- 재귀 (Recursive) 파트
SELECT
A.ID,
A.PARENT_ID,
B.GENERATION + 1
FROM
ECOLI_DATA A
INNER JOIN ECOLI_TREE B -- ECOLI_TREE(B)에서 자식 노드(A)를 찾아 계속 붙임.
ON A.PARENT_ID = B.ID
)
SELECT ID
FROM ECOLI_TREE -- 생성한 재귀중에서
WHERE GENERATION = 3 -- 3세대 데이터만 추출
ORDER BY ID'공부 일지 > 문제풀이' 카테고리의 다른 글
| [프로그래머스] 대장균의 크기에 따라 분류하기 2 (MySQL) (0) | 2024.11.28 |
|---|---|
| [프로그래머스] 연도별 대장균 크기의 편차 구하기 (MySQL) (0) | 2024.11.26 |
| [프로그래머스] 분기별 분화된 대장균의 개체 수 구하기 (MySQL) (0) | 2024.11.25 |
| [프로그래머스] 자동차 대여 기록 별 대여 금액 구하기 (MySQL) (0) | 2024.11.24 |
| [프로그래머스] 없어진 기록 찾기 (MySQL) (0) | 2023.12.04 |