🔗 1. 문제 URL
https://school.programmers.co.kr/learn/courses/30/lessons/299305
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📝 2. 문제 요구사항 정리
COLI_DATA 테이블에는 세포의 계보 정보가 들어있습니다.
- ID: 개체 ID
- PARENT_ID: 부모 개체의 ID
- SIZE_OF_COLONY / DATE / GENOTYPE 등은 이 문제에서 필요 없음
- 최초 개체는 PARENT_ID = NULL
우리가 해야 할 일은 "각 ID가 몇 명의 자식을 가지고 있는지 세기"
예를 들어:
- ID 1의 자식 = 3 → 자식 수 1
- ID 2의 자식 = 4, 5 → 자식 수 2
- ID 3, 5, 6 → 자식 없음 → 자식 수 0
그리고 ID 기준 오름차순 정렬.
문제는 단순하지만 “자식이 없는 경우도 0으로 보여야 한다”는 점에서 JOIN 타입을 잘 선택해야 합니다.
💡 3. 핵심 개념
✔ 1) 셀프 조인(Self Join)
같은 테이블끼리 부모–자식 관계를 만들기 위해 한 번은 부모 역할, 한 번은 자식 역할로 테이블을 두 번 불러옵니다.
✔ 2) LEFT JOIN을 사용하는 이유
- 부모 개체(E.ID)는 자식이 있을 수도 있지만 없을 수도 있습니다.
- 만약 INNER JOIN을 사용하면 자식이 없는 부모는 결과에서 제외됩니다.
- 하지만 문제는 모든 개체를 출력해야 하므로,
→ LEFT JOIN을 사용해 자식이 없으면 COUNT 결과가 0이 되도록 처리합니다.
✔ 3) COUNT(C.PARENT_ID)
LEFT JOIN 후 자식이 없는 경우에는 C.PARENT_ID가 NULL이 되므로
→ COUNT에서 자동으로 0으로 처리됩니다
✅ 4. 정답 SQL 코드
SELECT E.ID, COUNT(C.PARENT_ID) AS CHILD_COUNT
FROM ECOLI_DATA E LEFT JOIN (SELECT PARENT_ID
FROM ECOLI_DATA
) AS C
ON E.ID = C.PARENT_ID
GROUP BY E.ID
ORDER BY E.ID ASC;
-- 셀프조인을 이용한 더욱 간결한 정답 코드
SELECT
E.ID,
COUNT(C.PARENT_ID) AS CHILD_COUNT
FROM ECOLI_DATA E LEFT JOIN ECOLI_DATA C
ON E.ID = C.PARENT_ID
GROUP BY E.ID
ORDER BY E.ID ASC;
✔ 설명
- P = 부모 테이블 역할
- C = 자식 테이블 역할
- 만약 부모가 자식이 없으면 C.ID가 NULL이 되므로
COUNT(C.ID)은 자동으로 0이 된다. - 모든 부모 ID가 출력되어야 하므로 LEFT JOIN 사용
💬 5. 풀이하면서 느낀 점
이번 문제는 JOIN 종류의 차이, 셀프 조인 구조, 그리고 서브쿼리가 꼭 필요한가? 하는 부분에서 충분히 헷갈릴 수 있는 문제였습니다.
저 역시 처음에는 “부모–자식 관계를 구분해야 하니까 서브쿼리가 필요하겠지?”라고 생각하며 빠르게 풀려고 했습니다. 그런데 정답을 맞추고 나서 문득 “PARENT_ID를 그대로 매칭하면 되는데 굳이 서브쿼리를 써야 하나?”라는 고민이 들었습니다.
결국 핵심은 같은 테이블을 두 번 불러와 부모(P)와 자식(C) 역할만 구분해 주면 되는 단순한 셀프 조인 구조였고, 이걸 깨닫고 나니 문제 자체가 훨씬 명확하게 보였습니다.
이번 문제를 통해 “꼭 필요하지 않은 서브쿼리는 과감히 덜어내는 것” 그리고 “셀프 조인은 구조를 이해하면 의외로 단순하다”는 점을 다시 한 번 느낄 수 있었습니다.
궁금하신 점이나 포스팅에 대한 피드백이 있다면 댓글로 편하게 남겨주세요.
도움이 되셨다면 공감이나 댓글 한 줄 남겨주시면 포스팅을 이어가는 데 큰 힘이 됩니다. 😊
'코딩테스트 > MYSQL' 카테고리의 다른 글
| [프로그래머스 LV.2] 가격대 별 상품 개수 구하기 — MySQL 정답 & 해설 (0) | 2025.12.08 |
|---|---|
| [프로그래머스 LV.2] 상품 별 오프라인 매출 구하기 — MySQL 정답 & 해설 (0) | 2025.12.08 |
| [프로그래머스 LV.2] 분기별 분화된 대장균의 개체 수 구하기 — MySQL 정답 & 해설 (0) | 2025.12.03 |
| [프로그래머스 LV.2] 재구매가 일어난 상품과 회원 리스트 구하기 — MySQL 정답 & 해설 (0) | 2025.12.03 |
| [프로그래머스 LV.2] 성분으로 구분한 아이스크림 총 주문량 — MySQL 정답 & 해설 (0) | 2025.12.01 |