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

윤민선·2026년 6월 24일

프로그래머스

목록 보기
26/84

문제 설명

ECOLI_DATA 테이블에서 부모의 형질을 모두 보유한 자식 대장균의 ID, 자신의 GENOTYPE, 부모의 GENOTYPE을 ID 오름차순으로 조회하는 문제이다.

테이블주요 컬럼
ECOLI_DATAID, PARENT_ID, SIZE_OF_COLONY, DIFFERENTIATION_DATE, GENOTYPE

PARENT_ID는 부모 개체의 ID를 나타내며, 최초 개체의 PARENT_IDNULL이다.


접근 방법

문제를 읽고 핵심 조건을 먼저 정리해보았다.

자식 GENOTYPE & 부모 GENOTYPE = 부모 GENOTYPE

& 연산 결과가 부모 GENOTYPE과 같다는 것은, 부모가 가진 형질 비트가 자식 GENOTYPE 안에 모두 포함되어 있다는 의미이다.

부모 GENOTYPE = 5 → 0101 (1번, 3번 형질)
자식 GENOTYPE = 7 → 0111 (1번, 2번, 3번 형질)
 
자식 & 부모 = 0111 & 0101 = 0101 = 5 (= 부모) ✅ → 부모 형질 모두 보유
자식 GENOTYPE = 6 → 0110
 
자식 & 부모 = 0110 & 0101 = 0100 = 4 (≠ 부모) ❌ → 부모 형질 일부 미보유

ECOLI_DATA 테이블에는 PARENT_GENOTYPE 컬럼이 따로 없다. 부모의 GENOTYPE을 가져오려면 자식의 PARENT_ID로 같은 테이블에서 부모 행을 찾아야 한다. 즉 같은 테이블을 두 번 JOIN하는 셀프 조인이 필요하다.

FROM ECOLI_DATA C           -- 자식
JOIN ECOLI_DATA P           -- 부모
  ON C.PARENT_ID = P.ID     -- 자식의 PARENT_ID = 부모의 ID

이렇게 연결하면 C는 자식 행, P는 부모 행으로 각각의 GENOTYPE을 가져올 수 있다. 여기에 비트 조건을 WHERE절에 추가하면 된다.

구체적으로 정리한 풀이 흐름:

  1. ECOLI_DATAC(자식), P(부모)로 셀프 조인
  2. ON C.PARENT_ID = P.ID로 부모-자식 연결
  3. WHERE (C.GENOTYPE & P.GENOTYPE) = P.GENOTYPE으로 부모 형질 모두 보유한 자식 필터
  4. ORDER BY C.ID 오름차순 정렬

최종 코드

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

0개의 댓글