본문 바로가기
공부 & 프로젝트/SQL

[SQL TEST 14일차] Select, LV.1 : 특정 형질을 가지는 대장균 찾기

by donnanoa82 2025. 10. 14.

이제 마지막 Lv.1 문제 ! 여서 그런가 어려웟다... 역시 정답률이 낮은 이유가 있었음

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


문제 설명
대장균들은 일정 주기로 분화하며, 분화를 시작한 개체를 부모 개체, 분화가 되어 나온 개체를 자식 개체라고 합니다.
다음은 실험실에서 배양한 대장균들의 정보를 담은 ECOLI_DATA 테이블입니다. ECOLI_DATA 테이블의 구조는 다음과 같으며, ID, PARENT_ID, SIZE_OF_COLONY, DIFFERENTIATION_DATE, GENOTYPE 은 각각 대장균 개체의 ID, 부모 개체의 ID, 개체의 크기, 분화되어 나온 날짜, 개체의 형질을 나타냅니다.

최초의 대장균 개체의 PARENT_ID 는 NULL 값입니다.

문제
2번 형질이 보유하지 않으면서 1번이나 3번 형질을 보유하고 있는 대장균 개체의 수(COUNT)를 출력하는 SQL 문을 작성해주세요. 1번과 3번 형질을 모두 보유하고 있는 경우도 1번이나 3번 형질을 보유하고 있는 경우에 포함합니다.

예시
예를 들어 ECOLI_DATA 테이블이 다음과 같다면

 

각 대장균 별 형질을 2진수로 나타내면 다음과 같습니다.

ID 1 : 1000₍₂₎
ID 2 : 1111₍₂₎
ID 3 : 1₍₂₎
ID 4 : 1101₍₂₎

각 대장균 별 보유한 형질을 다음과 같습니다.

ID 1 : 4
ID 2 : 1, 2, 3, 4
ID 3 : 1
ID 4 : 1, 3, 4

따라서 2번 형질이 없는 대장균 개체는 ID 1, ID 3, ID 4 이며 이 중 1번이나 3번 형질을 보유한 대장균 개체는 ID 3, ID 4 입니다.

따라서 결과는 다음과 같아야 합니다.


#답

SELECT COUNT(*) AS COUNT

FROM ECOLI_DATA

WHERE (GENOTYPE & 2) = 0

AND ((GENOTYPE & 1) > 0

OR (GENOTYPE & 4) > 0);


#오답노트

SELECT COUNT(*) AS COUNT
  FROM ECOLI_DATA
 WHERE GENOTYPE IN (1, 3)

형질을 단순하게 1, 3의 숫자로만 봤기에 틀림 

형질을 2진수로 나타낸다고 기재되어있었는데 그냥 넘겨버림 사실 알았어도 &이 뭔지 몰라서 못풀었을듯 이 오답을 통해 하나 또 배웠당 ! 

 

문제: 

"2번 형질이 보유하지 않으면서 1번이나 3번 형질을 보유하고 있는 대장균 개체의 수(COUNT)를 출력하는 SQL 문을 작성해주세요. 1번과 3번 형질을 모두 보유하고 있는 경우도 1번이나 3번 형질을 보유하고 있는 경우에 포함합니다."

GENOTYPE(유전형)이라는 숫자에는 “이 균이 어떤 형질(특성)을 가지고 있는지”가 숫자로 합쳐서 들어있음 

=> 겹치지 않게 2진수 비트 표현

GENOTYPE 2진수로 보면 의미 (GENOTYPE & 1) (GENOTYPE & 2) (GENOTYPE & 4)
1 001 1번 형질 있음 1 0 0
2 010 2번 형질 있음 0 2 0
3 011 1,2번 형질 있음 1 2 0
4 100 3번 형질 있음 0 0 4
5 101 1,3번 형질 있음 1 0 4
6 110 2,3번 형질 있음 0 2 4
7 111 1,2,3번 형질 있음 1 2 4

 

*****&= “그 형질이 들어 있니?” 하고 검사하는 도구***

(... & n) = 0 “n번 형질이 없다
(... & n) > 0 “n번 형질이 있다

 

WHERE (GENOTYPE & 2) = 0
  AND ((GENOTYPE & 1) > 0 OR (GENOTYPE & 4) > 0)

  • (GENOTYPE & 2) = 0 → 2번 형질은 없고
  • (GENOTYPE & 1) > 0 → 1번 형질이 있거나
  • (GENOTYPE & 4) > 0 → 3번 형질이 있는 경우