imhamburger 님의 블로그

프로그래머스 SQL 문제풀이 - 대장균들의 자식의 수 구하기 본문

Mysql

프로그래머스 SQL 문제풀이 - 대장균들의 자식의 수 구하기

imhamburger 2025. 1. 19. 16:23

문제설명

 

대장균들은 일정 주기로 분화하며, 분화를 시작한 개체를 부모 개체, 분화가 되어 나온 개체를 자식 개체라고 합니다.
다음은 실험실에서 배양한 대장균들의 정보를 담은 ECOLI_DATA 테이블입니다. ECOLI_DATA 테이블의 구조는 다음과 같으며, ID, PARENT_ID, SIZE_OF_COLONY, DIFFERENTIATION_DATE, GENOTYPE 은 각각 대장균 개체의 ID, 부모 개체의 ID, 개체의 크기, 분화되어 나온 날짜, 개체의 형질을 나타냅니다.

 

Column name Type Nullable
ID INTEGER FALSE
PARENT_ID INTEGER TRUE
SIZE_OF_COLONY INTEGER FALSE
DIFFERENTIATION_DATE DATE FALSE
GENOTYPE INTEGER FALSE

 

최초의 대장균 개체의 PARENT_ID 는 NULL 값입니다.

 

 

문제

 

대장균 개체의 ID(ID)와 자식의 수(CHILD_COUNT)를 출력하는 SQL 문을 작성해주세요. 자식이 없다면 자식의 수는 0으로 출력해주세요. 이때 결과는 개체의 ID 에 대해 오름차순 정렬해주세요.

 

 

예전에 내가 작성한 풀이

select b.cnt_c as ID,
       sum(case when b.cnt_p = 0 then 0 else 1 end) as CHILD_COUNT
from(
select ifnull(dd.parent_id,0) cnt_p,
       a.d_id cnt_c
from ecoli_data dd
right join(
select d.id d_id
from ecoli_data d) a on dd.parent_id = a.d_id) b
group by ID
order by ID asc

 

 

다시 풀어본 풀이

SELECT ee.eeid AS ID,
        CASE WHEN e.parent_id IS null THEN 0
            ELSE COUNT(ee.eeid) END AS CHILD_COUNT
FROM ecoli_data e
RIGHT JOIN (SELECT id AS eeid FROM ecoli_data) ee ON e.parent_id = ee.eeid
GROUP BY ee.eeid
ORDER BY ID asc
;

 

첫 번째 쿼리는 불필요한 중첩 서브쿼리와 복잡한 조건문이 많아, 이해하기 어렵고 성능에도 부담을 줄 수 있지만..!

이번에 다시 풀었을 때 join을 한 번 사용하였고 불필요한 서브쿼리를 줄여보았다.

 

문제를 풀기 전에 어떤식으로 접근하고 해결해나갈지 고민을 조금 더 하는 시간을 가지니 더 효율적으로 쿼리를 작성할 수 있는 것 같다.