부모의 형질을 모두 보유한 대장균의 ID(ID), 대장균의 형질(GENOTYPE), 부모 대장균의 형질(PARENT_GENOTYPE)을 출력하는 SQL 문을 작성해주세요. 이때 결과는 ID에 대해 오름차순 정렬해주세요.
# 풀이1
SELECT D.ID, D.GENOTYPE, A.GENOTYPE AS PARENT_GENOTYPE
FROM ECOLI_DATA D LEFT JOIN ECOLI_DATA A ON D.PARENT_ID = A.ID
WHERE D.GENOTYPE ^ A.GENOTYPE = D.GENOTYPE - A.GENOTYPE
ORDER BY D.ID;
# 풀이2
SELECT D.ID, D.GENOTYPE, A.GENOTYPE AS PARENT_GENOTYPE
FROM ECOLI_DATA D LEFT JOIN ECOLI_DATA A ON D.PARENT_ID = A.ID
WHERE D.GENOTYPE & A.GENOTYPE = A.GENOTYPE
ORDER BY 1;
처음 이 문제를 접했을 때 부모의 형질을 담고 있는 자손을 어떻게 조건으로 걸어야 할지 1시간 넘게 고민했었다. 오늘 다시 풀었을 때 역시 이 부분이 가장 고민되었지만, 그래도 10분 내로 고민하고 해결할 수 있었다.
당시에 아래처럼 고민했었다.
부모의 형질을 모두 보유하고 있다는 의미
- 부모와 같은 형질인 경우
- 부모의 형질을 가지면서 다른 형질도 가지고 있는 경우
이걸 어떻게 쿼리문으로 나타낼지가 가장 큰 관건이다.
고민하다가 lv1에서 비슷한 문제가 나왔을 때 비트연산을 사용했던 것이 기억났다.
그렇다면 비트연산을 어떻게 적용해야할까?
부모와 같은 형질인 경우 ⇒ 비트연산없이 구현가능
부모의 형질을 가지면서 다른 형질도 가지고 있는 경우 ⇒ 이 부분이 어려움
고민하다가
XOR연산을 하는 경우 자손이 추가적으로 갖는 형질만 남는다는 사실을 알게 됨(풀이1에 적용)WHERE D.GENOTYPE ^ A.GENOTYPE = D.GENOTYPE - A.GENOTYPEAND연산으로 비교할 경우 부모의 형질만 나타난다는 사실을 알게 됨(풀이2에 적용)WHERE D.GENOTYPE & A.GENOTYPE = A.GENOTYPE