728x90
문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/301646
문제에서 주어진 ECOLI_DATA 테이블은 다음과 같은 값을 갖고 있다.
ID | 대장균 개체의 ID |
PARENT_ID | 부모 개체의 ID |
SIZE_OF_COLONY | 개체의 크기 |
DIFFERENTIATION_DATE | 분화되어 나온 날짜 |
GENOTYPE | 개체의 형질 |
이때, 문제에서 주어진 조건은 아래와 같다.
- 최초의 대장균 개체의 PARENT_ID 는 NULL 값
- 2번 형질이 보유하지 않으면서
- 1번이나 3번 형질을 보유하고 있는
- 대장균 개체의 수(COUNT)
- 1번과 3번 형질을 모두 보유하고 있는 경우도 1번이나 3번 형질을 보유하고 있는 경우에 포함
개념 설명
이 문제를 푸는데 핵심인 2진수 개념을 이해하기 힘들어서, 정리해보았다.
대장균의 형질(genotype)은 2진수로 표현된 숫자이며, 각 비트는 특정 형질의 보유 여부를 나타낸다.
예를 들어, 2진수에서 1의 자리는 1번 형질, 2의 자리는 2번 형질, 4의 자리는 3번 형질, 8의 자리는 4번 형질을 나타낸다.
즉, 형질의 2진수 표현과 우리가 흔히 사용자는 10진수 표현은 다음과 같다!
대장균의 형질 | 2진수 숫자 | 10진수 숫자 |
1번 형질 | 0001 | 1 |
2번 형질 | 0010 | 2 |
3번 형질 | 0100 | 4 |
4번 형질 | 1000 | 8 |
이제, 문제에서 주어진 예시 데이터를 확인해보자.
각 ID의 대장균 형질(genotype)을 2진수로 나타내면..
ID | 대장균의 형질 | 2진수 숫자 | 10진수 숫자 | 보유한 형질 |
1 | 8번 형질 | 1000 | 8 | 4 (네 번째 비트가 1) |
2 | 15번 형질 | 1111 | 15 | 1, 2, 3, 4 (모든 비트가 1) |
3 | 1번 형질 | 0001 | 1 | 1 (첫 번째 비트가 1) |
4 | 13번 형질 | 1101 | 13 | 1, 3, 4 (첫 번째, 세 번째, 네 번째 비트가 1) |
이 되는 것이다.
내 풀이
SELECT COUNT(*) as COUNT
FROM ECOLI_DATA
WHERE (GENOTYPE & 2) = 0 -- 2번 형질이 없음
AND (GENOTYPE & 1 > 0 OR GENOTYPE & 4 > 0); -- 1번 또는 3번 형질을 보유
느낀점
비트 연산은 항상 너무 어려운 것 같다. 해도해도 복잡하고 어렵다.
728x90
'코딩테스트 > SQL' 카테고리의 다른 글
[프로그래머스][MySQL] Lv. 2 특정 물고기를 잡은 총 수 구하기 (0) | 2024.07.15 |
---|---|
[프로그래머스][MySQL] Lv. 2 동명 동물 수 찾기 (0) | 2024.07.12 |
[프로그래머스][MySQL] Lv. 1 조건에 부합하는 중고거래 댓글 조회하기 (0) | 2024.07.09 |
[프로그래머스][MySQL] Lv. 1 자동차 대여 기록에서 장기/단기 대여 구분하기 (0) | 2024.06.06 |
[프로그래머스][MySQL] Lv. 1 잔챙이 잡은 수 구하기 (0) | 2024.06.05 |