[프로그래머스 LV.3] 대장균들의 자식의 수 구하기 — MySQL 정답 & 해설

2025. 12. 8. 18:39·코딩테스트/MYSQL

🔗 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
'코딩테스트/MYSQL' 카테고리의 다른 글
  • [프로그래머스 LV.2] 가격대 별 상품 개수 구하기 — MySQL 정답 & 해설
  • [프로그래머스 LV.2] 상품 별 오프라인 매출 구하기 — MySQL 정답 & 해설
  • [프로그래머스 LV.2] 분기별 분화된 대장균의 개체 수 구하기 — MySQL 정답 & 해설
  • [프로그래머스 LV.2] 재구매가 일어난 상품과 회원 리스트 구하기 — MySQL 정답 & 해설
작지만 꾸준한 성장으로
작지만 꾸준한 성장으로
contact
  • 작지만 꾸준한 성장으로
    파랑새
    작지만 꾸준한 성장으로
  • 전체
    오늘
    어제
    • 분류 전체보기 (26)
      • IT (3)
      • 코딩테스트 (23)
        • 알고리즘 (12)
        • MYSQL (11)
      • 패션 (0)
      • 독후감 (0)
      • TIL (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    파이썬
    Python
    python3
    Pandas groupby agg
    와이드 포맷 롱 포맷
    공공데이터 전처리
    데이터 리모델링
    프로그래머스 lv.2
    백준
    Pandas pivot
    데이터 전처리 파이프라인
    프로그래머스 lv.1
    Pandas melt
    알고리즘
    프로그래머스 lv.0
    Programmers
    CPU Bound
    코딩테스트
    데이터베이스
    모델 추론
    wide format
    파이썬코테
    mysql
    long format
    I/O Bound
    자바
    SWEA
    프로그래머스
    코테
    sql 코딩테스트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
작지만 꾸준한 성장으로
[프로그래머스 LV.3] 대장균들의 자식의 수 구하기 — MySQL 정답 & 해설
상단으로

티스토리툴바