문제 설명
대장균들은 일정 주기로 분화하며, 분화를 시작한 개체를 부모 개체, 분화가 되어 나온 개체를 자식 개체라고 합니다.
다음은 실험실에서 배양한 대장균들의 정보를 담은 ECOLI_DATA 테이블입니다. ECOLI_DATA 테이블의 구조는 다음과 같으며, ID, PARENT_ID, SIZE_OF_COLONY, DIFFERENTIATION_DATE, GENOTYPE 은 각각 대장균 개체의 ID, 부모 개체의 ID, 개체의 크기, 분화되어 나온 날짜, 개체의 형질을 나타냅니다.
Column name Type Nullable
ID | INTEGER | FALSE |
PARENT_ID | INTEGER | TRUE |
SIZE_OF_COLONY | INTEGER | FALSE |
DIFFERENTIATION_DATE | DATE | FALSE |
GENOTYPE | INTEGER | FALSE |
최초의 대장균 개체의 PARENT_ID 는 NULL 값입니다.
문제
2번 형질이 보유하지 않으면서 1번이나 3번 형질을 보유하고 있는 대장균 개체의 수(COUNT)를 출력하는 SQL 문을 작성해주세요. 1번과 3번 형질을 모두 보유하고 있는 경우도 1번이나 3번 형질을 보유하고 있는 경우에 포함합니다.
예시
예를 들어 ECOLI_DATA 테이블이 다음과 같다면
ID PARENT_ID SIZE_OF_COLONY DIFFERENTIATION_DATE GENOTYPE
1 | NULL | 10 | 2019/01/01 | 8 |
2 | NULL | 2 | 2019/01/01 | 15 |
3 | 2 | 100 | 2020/01/01 | 1 |
4 | 2 | 16 | 2020/01/01 | 13 |
각 대장균 별 형질을 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 입니다.
따라서 결과는 다음과 같아야 합니다.
COUNT
2
select count(id) as count
from ECOLI_DATA
where genotype & 2 = 0 and(genotype & 1 > 0 or genotype & 5)
비트연산자 사용
연산자 의미 예시 (5) 결과 (2진수)
& | AND (공통 비트 확인) | 5 & 3 = 1 | 101 & 011 = 001 |
` | ` | OR (하나라도 1이면 1) | `5 |
^ | XOR (다를 때만 1) | 5 ^ 3 = 6 | 101 ^ 011 = 110 |
~ | NOT (비트 반전) | ~5 = -6 | ~00000101 = 11111010 |
<< | 왼쪽 시프트 (x2^n) | 5 << 1 = 10 | 00000101 << 1 = 00001010 |
>> | 오른쪽 시프트 (/2^n) | 5 >> 1 = 2 | 00000101 >> 1 = 00000010 |
비트 위치 (오른쪽부터) 값 (2진수) 10진수 값
0번째 자리 | 0001 | 1 |
1번째 자리 | 0010 | 2 |
2번째 자리 | 0100 | 4 |
3번째 자리 | 1000 | 8 |
... | ... | ... |
조건 유형 SQL 조건식
해당 비트가 켜져 있음 (1) | value & 비트값 > 0 |
해당 비트가 꺼져 있음 (0) | value & 비트값 = 0 |
정확히 특정 비트 조합일 때 | value = 값 |
특정 비트 조합 포함 여부 | value & 조건 = 조건 |
SELECT *
FROM your_table
WHERE (value & 1) > 0 -- 1번째 비트 = 1
AND (value & 2) = 0 -- 2번째 비트 = 0
AND (value & 4) > 0; -- 3번째 비트 = 1
✅ 이 조건을 만족하는 값 예: 5 (101)
'SQL > SQL 코딩테스트' 카테고리의 다른 글
[mysql] 특정 조건을 만족하는 물고기별 수와 최대 길이 구하기 (0) | 2025.06.03 |
---|---|
[mysql] 물고기 종류 별 대어 찾기 (2) | 2025.06.02 |
[mysql] 연도별 대장균 크기의 편차 구하기 (0) | 2025.05.31 |
[mysql] 가격대 별 상품 개수 구하기 (0) | 2025.05.30 |
[mysql] 업그레이드 된 아이템 구하기 (2) | 2025.05.27 |