우당탕탕 개발일지

[SQL] 프로그래머스 SELECT : 부모의 형질을 모두 가지는 대장균 찾기(level 2) - 2회차 복습 완료 본문

SQL

[SQL] 프로그래머스 SELECT : 부모의 형질을 모두 가지는 대장균 찾기(level 2) - 2회차 복습 완료

민아당긴아 2024. 7. 2. 16:46

💡문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

  1. 부모의 형질을 모두 가지는 대장균 찾
 

 

💡SQL 코드 설계

부모의 형질을 모두 보유한 대장균의 ID(ID), 대장균의 형질(GENOTYPE), 부모 대장균의 형질(PARENT_GENOTYPE)을 출력하는 SQL 문을 작성해주세요. 이때 결과는 ID에 대해 오름차순 정렬해주세요.

ECOLI_DATA 테이블 두 개를 서로 연결해야 하는데, 이 때 키조건은

PARENT.ID = E.PARENT_ID

그리고 형질 조건을 만족하는지 보기 위해서 비트 연산자를 써야한다!

ED1.GENOTYPE & ED2.GENOTYPE = ED2.GENOTYPE

💡SQL 코드

-- 코드를 작성해주세요
WITH PARENT AS (
    SELECT ID, GENOTYPE AS PARENT_GENOTYPE
    FROM ECOLI_DATA
)
SELECT
    E.ID, GENOTYPE, PARENT_GENOTYPE
FROM
    ECOLI_DATA AS E
JOIN
    PARENT
ON
    PARENT.ID = E.PARENT_ID
WHERE
    (E.GENOTYPE & PARENT_GENOTYPE) >= PARENT_GENOTYPE
ORDER BY
    ID

 

💡다른 풀이

SELECT
    ED1.ID, ED1.GENOTYPE, ED2.GENOTYPE AS PARENT_GENOTYPE
FROM ECOLI_DATA AS ED1
LEFT JOIN ECOLI_DATA AS ED2
ON ED1.PARENT_ID = ED2.ID
WHERE ED1.GENOTYPE & ED2.GENOTYPE = ED2.GENOTYPE
ORDER BY ED1.ID

나는 ECOLI_DATA 테이블을 두 번 써야 하는데, 어떻게 써야할지 몰라서 WITH문을 사용했다.

그런데 이 풀이에서는 그냥 ED1, ED2로 나눠서 풀었다.

이게 더 깔끔한 것 같다.

앞으로 하나의 테이블을 두 번 써야할 때에는 이렇게 1, 2로 구분해서 쓰자!

 

그리고 비트 연산자가 너무 어려웠다..처음에는 ED1.GENOTYPE & ED2.GENOTYPE >0인 줄 알았는데

생각해보니 아니었다.

예를 들어 자식이 1번 형질과 3번 형질을 가지고 있고, 부모가 2번 형질과 3번 형질을 가지고 있는 경우 문제대로라면 출력하면 안되지만 ED1.GENOTYPE & ED2.GENOTYPE >0는 만족한다. 즉, 이 부등식이 틀렸다는 소리.

ED1.GENOTYPE & ED2.GENOTYPE = ED2.GENOTYPE

이렇게 등호를 만족해야 한다. 예를 들어 GENOTYPE이 5(=b0101)이고 PARENT_GENOTYPE이 3(=b0011)이면

0101 & 0011 = 0001이므로 포함이 안되고,

GENOTYPE이 13(=b1101)이고 PARENT_GENOTYPE이 5(=b0101)이면 1101 & 0101 = 0101이라 포함된다.