728x90
문제
https://school.programmers.co.kr/learn/courses/30/lessons/301646
- 2번 형질이 보유하지 않으면서 1번이나 3번 형질을 보유하고 있는 대장균 개체의 수(COUNT)를 출력
- 1번과 3번 형질을 모두 보유하고 있는 경우도 포함
테이블
ECOLI_DATA |
- ID별 GENOTYPE 이진수
- ID 1 : 8 → 1000⑵
- ID 2 : 15 → 1111⑵
- ID 3 : 1 → 1⑵
- ID 4: 13 → 1101⑵
- 각 대장균 별 보유한 형질
- ID 1 : 4
- ID 2 : 1, 2, 3, 4
- ID 3 : 1
- ID 4 : 1, 3, 4
- 위 두 내용을 종합해보면,
GENOTYPE 이진수를 보고, 1~4번까지 각 형질의 유무를 확인할 수 있음
GENOTYPE이 13인 경우, 이진수는 1101⑵
자릿수 | $ 2^3 $ | $ 2^2 $ | $ 2^1 $ | $ 2^0 $ |
형질 | 4번 형질 | 3번 형질 | 2번 형질 | 1번 형질 |
이진수 | 1 | 1 | 0 | 1 |
→ GENOTYPE이 13이면 1번, 3번, 4번 형질을 가지고 있는 것.
풀이과정
# 2번 형질을 보유하지 않아야 함
- 비트연산자(&)로 GENOTYPE과 2를 비교했을 때 0 (=False)인 경우만 조회하기
- 이 때 비교하는 2는 '2'번 형질의 2가 아님!
- 2번 형질의 유무를 판단하는 '자릿수'를 의미하는 것.
만약 2번 형질을 보유하고 있다면, $2^1$ 자릿수에 1이 찍히게 되는데
문제에서는 2번 형질을 보유하지 않는 결과를 요구하고 있으므로
해당 자리가 1이 아닌(0 = False)인 결과가 나오도록 조건을 설정하면 됨
- 2번 형질의 유무를 판단하는 '자릿수'를 의미하는 것.
# 1번 형질과 3번 형질을 보유하고 있어야 함
- 비트연산자(&)로 GENOTYPE이 1이거나 3인 경우 조회하기
- 앞서 말했듯이 1번 형질의 보유 여부는 $2^0$의 자릿수에서,
3번 형질의 보유 여부는 $2^2$의 자릿수에서 찾아야 함- 그래서 GENOTYPE & 1 또는 GENOTYPE & 4 인 조건을 주고,
이진수의 각 자리에 1번과 3번 형질이 존재하는 경우(1이 있는 경우)만 필터링되게 함
- 그래서 GENOTYPE & 1 또는 GENOTYPE & 4 인 조건을 주고,
# 정답
1 2 3 4 | SELECT COUNT(ID) COUNT FROM ECOLI_DATA WHERE (GENOTYPE & 2) = 0 AND ((GENOTYPE & 1) OR (GENOTYPE & 4)) | cs |
728x90
'코딩테스트 > SQL 코드카타' 카테고리의 다른 글
MySQL 프로그래머스 | 대장균의 크기에 따라 분류하기 2 (PERCENT_RANK 함수 사용) (1) | 2024.10.11 |
---|---|
MySQL 프로그래머스 | 부모의 형질을 모두 가지는 대장균 찾기 (비트연산자, IN 활용) (1) | 2024.10.10 |
MySQL 프로그래머스 | 언어별 개발자 분류하기 (GROUP_CONCAT, FIND_IN_SET 함수) (2) | 2024.09.30 |
MySQL 프로그래머스 | 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (2) | 2024.09.25 |
MySQL 프로그래머스 | 식품분류별 가장 비싼 식품의 정보 조회하기 (2) | 2024.09.24 |
댓글