취업준비/코딩테스트 문제 풀이

[프로그래머스 SQL 코딩테스트 연습] Lv3. 대장균들의 자식의 수 구하기 (MySQL)

상급닌자연습생 2024. 7. 8. 15:54

🤔 문제

대장균들은 일정 주기로 분화하며, 분화를 시작한 개체를 부모 개체, 분화가 되어 나온 개체를 자식 개체라고 합니다.

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

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

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

 

 

예시

예를 들어 `ECOLI_DATA` 테이블이 다음과 같다면

 

 

`ID` 1인 개체의 자식은 `ID` 3으로 1개 `ID` 2인 개체의 자식은 `ID` 4,5 로 2개 `ID` 4인 개체의 자식은 `ID` 6으로 1개이며 나머지 개체들은 자식이 없으므로 `ID` 에 대해 오름차순 정렬하면 결과는 다음과 같아야 합니다.

 

 

 

 

 

 


💻 나의 풀이

WITH CHILD AS (
    SELECT PARENT_ID AS ID, COUNT(PARENT_ID) AS CNT
    FROM ECOLI_DATA
    GROUP BY 1
)
SELECT e.ID, IFNULL(c.CNT, 0) AS CHILD_COUNT
FROM ECOLI_DATA e
LEFT JOIN CHILD c ON e.ID=c.ID
ORDER BY 1;

 

 

결과

 

 

 


💡 다른 풀이

정답 처리 되었으나, 생각보다 내가 복잡하게 풀어서 다른 풀이를 찾아보았다.

 

 

 

1. 동일한 테이블을 LEFT JOIN한 풀이

SELECT P.ID, COUNT(C.PARENT_ID) AS CHILD_COUNT
FROM ECOLI_DATA P -- 부모라 가정
LEFT JOIN ECOLI_DATA C -- 자식이라 가정
ON P.ID = C.PARENT_ID
GROUP BY 1
ORDER BY 1

 

  1. 주어진 원본 테이블을 자기 자신과 `LEFT JOIN`하여 P(부모 테이블이라 가정)의 `ID`가 C(자식 테이블이라 가정)의 `PARENT_ID`와 일치하는 경우를 찾는다.
  2. 각 부모 ID(`P.ID`)에 대하여 자식 ID(`C.ID`)의 개수를 카운트해서 `CHILD_COUNT`라는 컬럼을 생성한다.
  3. 모든 대장균 개체(`P.ID`)를 그룹화해서 자식의 수를 계산한다.

 

 

 

 

2. 서브쿼리를 활용한 풀이

SELECT ID,
		(SELECT COUNT(*)
		FROM ECOLI_DATA
		WHERE PARENT_ID = ED.ID) AS CHILD_COUNT
FROM ECOLI_DATA ED
ORDER BY 1;

원본 테이블(`ED`)의 자식 ID와 부모 ID가 일치하는 행에 대하여 개수를 카운트해서 반환하는 식

 

 

 

 

 

 

 

 


🔗 References

 

[서브쿼리를 활용한 풀이 참고]

https://yongku.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4SQL-%EB%8C%80%EC%9E%A5%EA%B7%A0%EB%93%A4%EC%9D%98-%EC%9E%90%EC%8B%9D%EC%9D%98-%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0-MySQL

 

[프로그래머스/SQL] 대장균들의 자식의 수 구하기 MySQL

츄르사려고 코딩하는집사입니다. 1. [프로그래머스/SQL] 대장균들의 자식의 수 구하기 MySQL 2. 문제 출처 https://school.programmers.co.kr/learn/courses/30/lessons/299305 프로그래머스 코드 중심의 개발자 채용.

yongku.tistory.com