몸과 마음이 건전한 SW 개발자

[SQL-SELECT] 프로그래머스 Lv. 2 부모의 형질을 모두 가지는 대장균 찾기 [다시 풀어 보기] 본문

SQL/다시 풀어 보기

[SQL-SELECT] 프로그래머스 Lv. 2 부모의 형질을 모두 가지는 대장균 찾기 [다시 풀어 보기]

스위태니 2024. 12. 19. 17:00

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/301647

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

틀린 코드

SELECT ID, GENOTYPE, GENOTYPE AS PARENT_GENOTYPE
FROM ECOLI_DATA AS ED
WHERE GENOTYPE & (SELECT GENOTYPE 
                  FROM ECOLI_DATA AS SUB
                  WHERE ED.PARENT_ID = SUB.ID) > 0;

정답 코드

SELECT 
    E1.ID, 
    E1.GENOTYPE, 
    E2.GENOTYPE AS PARENT_GENOTYPE
FROM ECOLI_DATA E1
JOIN ECOLI_DATA E2
ON E1.PARENT_ID = E2.ID
WHERE (E1.GENOTYPE | E2.GENOTYPE) = E1.GENOTYPE
ORDER BY E1.ID;

풀이 과정

  1.  FROM ECOLI_DATA E1 JOIN ECOLI_DATA E2 ON E1.PARENT_ID = E2.ID
    • E1은 자식 대장균, E2는 부모 대장균을 나타낸다.
    • E1.PARENT_ID = E2.ID 조건을 통해 자식 대장균과 부모 대장균의 관계를 연결한다.
  2. WHERE (E1.GENOTYPE | E2.GENOTYPE) = E1.GENOTYPE  
    • | 연산자: 비트 OR 연산자로, 자식 대장균의 형질이 부모 대장균의 형질을 포함하는지 확인한다.
      • E1.GENOTYPE | E2.GENOTYPE은 자식 대장균과 부모 대장균의 형질을 OR 연산한 결과다.
      • 결과가 E1.GENOTYPE과 동일하면, 부모의 모든 형질을 자식이 포함하고 있다는 뜻이다.
  3. SELECT E1.ID, E1.GENOTYPE, E2.GENOTYPE AS PARENT_GENOTYPE  
    • 자식 대장균의 ID (E1.ID)와 형질 (E1.GENOTYPE), 부모 대장균의 형질 (E2.GENOTYPE)을 선택한다.
  4. ORDER BY E1.ID  
    • 결과를 자식 대장균의 ID 기준으로 오름차순 정렬한다.

느낀점

  • 조인을 하는 과정에서 부모 아이디와 아이디가 같은지 찾고 그 중에서 비트연산을 사용해 부모 형질을 모두 가진 대장균 찾기는 너무나 어려운 것 같다.