[MySQL] 프로그래머스 - 부모의 형질을 모두 가지는 대장균 찾기

켈로그·2025년 6월 11일

SQL

목록 보기
18/20

프로그래머스 - SQL 고득점 Kit - 부모의 형질을 모두 가지는 대장균 찾기


문제 요약

ECOLI_DATA 테이블에는 실험실에서 배양한 대장균의 정보가 들어 있습니다. 각 대장균은 GENOTYPE이라는 형질 정보를 갖고 있으며, 자식 개체는 부모의 ID(PARENT_ID)를 참조합니다.

각 개체는 최대 4개의 형질(1~4)을 보유할 수 있으며, 이는 이진수 형태로 GENOTYPE 컬럼에 저장되어 있습니다.

목표:
부모의 형질을 모두 보유한 자식 개체의 ID, GENOTYPE, 부모의 GENOTYPE을 출력합니다.
결과는 ID 오름차순 정렬로 출력합니다.


💡 데이터 구조

컬럼명설명
ID대장균 고유 ID
PARENT_ID부모 대장균의 ID (NULL인 경우 최초 개체)
GENOTYPE형질 정보 (정수, 이진수로 해석 가능)

접근 방식

1. 자식과 부모 정보 비교 - JOIN

자식의 GENOTYPE이 부모의 GENOTYPE을 모두 포함하는지 판단하려면
한 줄에서 자식과 부모 정보를 함께 가져와야 함.

따라서 ECOLI_DATA 테이블을 자기 자신과 JOIN해야 함.

FROM ECOLI_DATA c
JOIN ECOLI_DATA p ON c.PARENT_ID = p.ID
  • c: 자식 개체 (child)
  • p: 부모 개체 (parent)

2. 형질 포함 여부는 비트 연산으로 판별

WHERE (c.GENOTYPE & p.GENOTYPE) = p.GENOTYPE
  • &: 비트 AND 연산자
  • 자식이 부모의 형질을 모두 갖고 있다면,
    자식 AND 부모 = 부모 조건이 성립

예:

  • 부모 GENOTYPE = 3 (011)
  • 자식 GENOTYPE = 7 (111)
    → 111 & 011 = 011 ⇒ 조건 만족

최종 풀이 코드

SELECT 
  c.ID,
  c.GENOTYPE,
  p.GENOTYPE AS PARENT_GENOTYPE
FROM ECOLI_DATA c
JOIN ECOLI_DATA p ON c.PARENT_ID = p.ID
WHERE (c.GENOTYPE & p.GENOTYPE) = p.GENOTYPE
ORDER BY c.ID;

결과 예시

IDGENOTYPEPARENT_GENOTYPE
211
331
751
8135

개념 보충: 자기 자신과 JOIN하는 이유

SQL에서는 같은 테이블이라도 두 개체 간 값을 비교하려면
JOIN을 통해 두 줄을 하나의 줄로 합쳐야 합니다.

JOIN ECOLI_DATA p ON c.PARENT_ID = p.ID
  • c는 자식 개체
  • p는 부모 개체
    → 부모의 GENOTYPE을 함께 가져오므로, 비교 연산이 가능해짐
profile
호랑이기운

0개의 댓글