재귀 함수

도로롱·2025년 8월 26일

⭐목적:

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


❤️오답노트 활용 팁

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

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

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

⭐ 오답 노트 TEMPLATE

📆 날짜: 2025-08-26

📌 문제 정보

  • 출처 및 번호: [예: 프로그래머스/입양 시각 구하기(2)]
  • 문제 링크: [https://school.programmers.co.kr/learn/courses/30/lessons/59413]

📝 문제 요약

  • [예: '0~23시 까지의 입양 시각대별 입양 카운팅하기']

❌ 나의 오답 코드

-- 여기에 내가 작성했던 틀린 코드를 그대로 붙여넣으세요.
SELECT 1
UNION ALL
SELECT 2
....

이런식으로 23까지 감 ---> 비효율적

🤔 오답 원인 분석
오류 메시지 또는 실패 원인: [예: '정답이긴 하지만 상대적 비효율적인 쿼리(하드코딩).']

근본적인 실수: [예: '재귀함수를 평소 쓰지 않아 활용도가 낮아 까먹음.']

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

✅ 정답 코드 및 핵심 로직

WITH RECURSIVE TimeNumbers (hour,COUNT) AS (
    -- 재귀의 시작점
    SELECT 
        0 AS HOUR,
        0 AS COUNT
    UNION ALL
    -- 반복되는 부분
    SELECT 
        hour + 1 AS HOUR,
        0 AS COUNT
    FROM TimeNumbers
    WHERE hour < 23
)
SELECT
    T.HOUR,
    CASE WHEN
    MAIN.HOUR IS NULL THEN T.COUNT
    ELSE MAIN.COUNT END AS COUNT
FROM
    TimeNumbers T
LEFT JOIN
(SELECT
    HOUR(DATETIME) AS HOUR,
    COUNT(ANIMAL_ID) AS COUNT
FROM
    ANIMAL_OUTS 
GROUP BY
    1
ORDER BY
    1
) AS MAIN ON MAIN.HOUR = T.HOUR
ORDER BY
    1
  • 핵심 로직:
    - 재귀 함수로 0부터 23시 까지 나오도록 재귀의 시작점과 반복되는 부분을 UNION ALL 하며, WHERE 조건에 24가 되기 전까지만 EXIT 조건 걸기
    - 재귀 함수로 만들어진 테이블을 메인 테이블로 가져가서, LEFT 조인을 걸어 0~23시 시각이 사라지지 않게끔 조건 걸기
    - 입양 테이블의 시각대가 없는 경우는 0, 있는 경우는 입양 테이블의 입양 빈도수를 카운팅 하는 컬럼으로 대체 (CASE WHEN문)

📚 핵심 개념 및 배운 점

  • 주요 함수/문법: 재귀 함수 사용

  • 배운 점:
    ㄴ SELECT 절에 반복되는 숫자를 넣는 방법 = 재귀 함수 사용 (RECURSIVE)
    (SELECT 1,2,3,4,.... 특정 숫자) 이런식으로 넣는 방법을 무식하게
    SELECT 1
    UNION ALL
    SELECT 2 ... 이런식으로 하면 너무 비효율적이다.


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

0개의 댓글