KATA는 기술과 기술 향상에 초점을 맞춘 코드 챌린지입니다.
일부는 프로그래밍 기본 사항을 교육하는 반면 다른 일부는 복잡한 문제 해결에 중점을 둡니다.
이 용어는 The Pragmatic Programmer 라는 책의 공동 저자인 Dave Thomas 가
무술에서 일본의 카타 개념을 인정하면서 처음 만들어졌습니다.
Dave의 개념 버전은 코드 카타를 프로그래머가
연습과 반복을 통해 기술을 연마하는 데 도움이 되는 프로그래밍 연습으로 정의합니다.
프로그래머스에서 SQL 문제 풀기
문제
- 부모 개체와 자식 개체의 관계를 세대로 표현하여
각 세대별 자식이 없는 대장균의 갯수와 세대를 조회하는 쿼리 작성- 각 대장균 세대 기준 오름차순 정렬
✔️ 제출 쿼리
✔️ 쿼리 분석
WITH RECURSIVE Generation AS (
# 첫 번째 세대 선택: PARENT_ID가 NULL인 개체를 찾음
SELECT ID
, PARENT_ID
, 1 AS GENERATION
FROM ECOLI_DATA
WHERE PARENT_ID IS NULL
UNION ALL
# 재귀적으로 다음 세대 찾기: 이전 세대의 ID를 부모 ID로 가지는 개체를 찾음
SELECT E.ID
, E.PARENT_ID
, G.GENERATION + 1 AS GENERATION
FROM ECOLI_DATA E
INNER JOIN Generation G ON E.PARENT_ID = G.ID
)
# 각 세대와 세대별 부모 ID가 없는 개체의 갯수 찾기
SELECT COUNT(G.ID) COUNT
, G.GENERATION
FROM Generation G
WHERE G.ID NOT IN (
SELECT PARENT_ID
FROM Generation
WHERE PARENT_ID IS NOT NULL
)
GROUP BY G.GENERATION
ORDER BY G.GENERATION
첫 번째 세대 선택
SELECT ID , PARENT_ID , 1 AS Gen FROM ECOLI_DATA WHERE PARENT_ID IS NULL
- PARENT_ID가 NULL인 개체들을 선택하여 첫 번째 세대로 설정
- Gen 컬럼을 1로 설정하여 첫 번째 세대를 표시
재귀적으로 다음 세대 찾기
- UNION ALL을 사용하여 첫 번째 세대의 자식 개체들을 재귀적으로 찾고,
INNER JOIN Generation G ON E.PARENT_ID = G.ID
를 사용하여
현재 세대의 ID를 부모 ID로 가지는 개체들을 찾기SELECT E.ID , E.PARENT_ID , G.Gen + 1 AS Gen FROM ECOLI_DATA E INNER JOIN Generation G ON E.PARENT_ID = G.ID
- 부모 ID가 이전 세대의 ID인 개체들을 찾아 세대를 하나씩 증가시키기
최종 결과 선택
- 각 세대별 부모 ID 가 존재하지 않는 개체를 찾고,
세대별 갯수 조회SELECT COUNT(G.ID) COUNT , G.GENERATION FROM Generation G WHERE G.ID NOT IN ( SELECT PARENT_ID FROM Generation WHERE PARENT_ID IS NOT NULL ) GROUP BY G.GENERATION ORDER BY G.GENERATION
- WHERE 조건절을 활용해 부모 ID 가 존재하지 않는 개체를 찾기
- 세대별로 그룹화하여 각 그룹별 ID의 갯수 조회
- 결과를 세대 오름차순으로 정렬하여 출력