재귀함수

도로롱·2025년 8월 13일

⭐목적:

해당 섹션은 프로그래머스/리트코드/해커랭커 등 외부 사이트에서 SQL 오답 문제에 대한 오답을 적고, 어느 부분에서 막혔고, 무엇을 배웠는지에 대해 간략하게 기록 하기 위함임.


❤️오답노트 활용 팁

  1. 원인 분석에 집중하세요: 정답 코드를 이해하는 것보다 내가 왜 틀렸는지를 한두 줄이라도 직접 글로 써보는 과정이 가장 중요합니다. '실수했다'에서 그치지 않고 '왜 실수했는지'를 파고들어야 같은 실수를 반복하지 않습니다.

  2. 태그를 적극적으로 활용하세요: #JOIN, #서브쿼리, #날짜함수 와 같이 태그를 꾸준히 달아두면, 나중에 특정 개념이 약하다고 느낄 때 해당 태그가 달린 문제들만 모아서 복습할 수 있습니다.

  3. 주기적으로 다시 풀어보세요: 일주일 뒤, 한 달 뒤에 오답 노트를 보면서 코드를 보지 않고 다시 한번 풀어보세요. 완벽하게 풀 수 있다면 그 개념은 이제 당신의 것이 된 겁니다.

⭐ 오답 노트 TEMPLATE

📆 날짜: 2025-08-14

📌 문제 정보

  • 출처 및 번호: [예: 프로그래머스/멸종위기의 대장균 찾기]
  • 문제 링크: [https://school.programmers.co.kr/learn/courses/30/lessons/301651]

📝 문제 요약

  • [예: '자식이 없는 대장균 찾기']

❌ 나의 오답 코드

-- 여기에 내가 작성했던 틀린 코드를 그대로 붙여넣으세요.
WITH KID AS (
SELECT
    ID,
    CASE WHEN
        ID IN (SELECT PARENT_ID FROM ECOLI_DATA) THEN 1
        ELSE 0 END AS KID_CNT
FROM
    ECOLI_DATA

)



🤔 오답 원인 분석
오류 메시지 또는 실패 원인: [예: '자식이 없는 케이스를 WITH절로 빼고, 세대를 구하는 식을 생각했지만 떠오르지 않음']

근본적인 실수: [예: '재귀함수를 생각할 수 없었음']

헷갈렸던 개념: [예: '.']

✅ 정답 코드 및 핵심 로직

WITH RECURSIVE GENERATION_DATA
AS(
SELECT
	ID,
    1 AS GENERATION #--- 1세대 (부모세대가 없는 경우)
FROM
	ECOLI_DATA
WHERE
	PARENT_ID IS NULL
UNION ALL

SELECT
	E.ID,
    G.GENERATION +1 #--- 부모세대 +1 = 자식세대
FROM
	ECOLI_DATA E
    JOIN GENERATION_DATA G ON G.ID = E.PARENT_ID #--- 자식과 부모세대 연결
)
SELECT
	COUNT(*) AS COUNT,
    GENERATION # ---세대 별 무자식 개체 카운팅
FROM
	GENERATION_DATA 
WHERE
	ID NOT IN 
    (SELECT DISTINCT PARENT_ID FROM ECOLI_DATA WHERE PARENT_ID IS NOT NULL) # -- 서브쿼리: 부모 명단에 속하지 않는 ID
GROUP BY
	GENERATION
ORDER BY
	GENERATION
  • 핵심 로직: 재귀함수로 ID별 세대를 세고, 서브쿼리로 자식이 없는 개체를 WHERE 조건절로 가져가는 것이 포인트

📚 핵심 개념 및 배운 점

  • 주요 함수/문법: RECURSIVE 함수

  • 배운 점:
    ㄴSQL 재귀는 주로 WITH RECURSIVE 구문(CTE)를 사용해 구현하며, 핵심 요소는
    ① 앵커 멤버: 재귀의 시작점. 단 한번만 실행
    ② 재귀 멤버: 앵커 멤버나 이전의 재귀 단계를 참조하여 반복적으로 실행되는 쿼리
    ㄴ 예시

WITH RECURSIVE NumberSeries AS (
    -- 1. 앵커 멤버: 시작 숫자 1을 선택
    SELECT 1 AS n

    UNION ALL

    -- 2. 재귀 멤버: 이전 단계의 숫자에 1을 더한다
    SELECT n + 1
    FROM NumberSeries
    WHERE n < 5 -- 종료 조건: n이 5가 되면 더 이상 재귀하지 않는다
)

-- 최종 결과 선택
SELECT * FROM NumberSeries;
*결과 값: 1,2,3,4,5
*입력값/출력값
1 ---> 앵커부분 (출력값만 존재)
N=1 /2 ---> 여기서 부터 재귀 부분
N=2 /3
N=3/4
N=4/5
N=5 ---> STOP: WHERE 조건이 N<5 이므로

profile
질문 없는 성장은 없다. 3년차 데이터 분석가

0개의 댓글