📌 문제 정보
- 문제 이름 : 프로그래머스 - (SELECT) 특정 형질을 가지는 대장균 찾기
- 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/301646
📌 문제 요약
- ECOLI_DATA 테이블 : ID(대장균 개체의 ID), PARENT_ID(부모 개체의 ID), SIZE_OF_COLONY(개체의 크기), DIFFERENTIATION_DATE(분화되어 나온 날짜), GENOTYPE(개체의 형질)
- 2번 형질이 보유하지 않으면서 1번이나 3번 형질을 보유하고 있는 대장균 개체의 수(COUNT)를 출력하는 SQL 문 작성. 1번과 3번 형질을 모두 보유하고 있는 경우도 1번이나 3번 형질을 보유하고 있는 경우에 포함
예시)
| ID | PARENT_ID | SIZE_OF_COLONY | DIFFERENTIATION_DATE | GENOTYPE | 대장균 별 형질 2진수 |
| 1 | NULL | 10 | 2019/01/01 | 8 | 1000₍₂₎ |
| 2 | NULL | 2 | 2019/01/01 | 15 | 1111₍₂₎ |
| 3 | 2 | 100 | 2020/01/01 | 1 | 1₍₂₎ |
| 4 | 2 | 16 | 2020/01/01 | 19 | 1101₍₂₎ |
- 각 대장균 별 보유한 형질 : ID 1 : 4 / ID 2 : 1, 2, 3, 4 / ID 3 : 1 / ID 4 : 1, 3, 4
- GENOTYPE -> 2진수로 변환한
출력) 2번 형질이 없는 대장균 개체는 ID 1, ID 3, ID 4 이며 이 중 1번이나 3번 형질을 보유한 대장균 개체는 ID 3, ID 4 => 2
COUNT | 2
📌 내 풀이 및 코드
SELECT COUNT(*) AS COUNT
FROM ECOLI_DATA
WHERE
GENOTYPE & 2 = 0
AND (GENOTYPE & 1 != 0 OR GENOTYPE & 4 != 0);
- 비트 마스크 연산이라는걸 처음 알았음.
- 2번 형질 없음: ID 1, 3, 4 / 그 중 1번 또는 3번 형질 있음: ID 3, 4 → ✅ 총 2개
| ID | GENOTYPE (10진수) | 2진수 | 형질 목록 |
| 1 | 8 | 1000₂ | 4 |
| 2 | 15 | 1111₂ | 1, 2, 3, 4 |
| 3 | 1 | 0001₂ | 1 |
| 4 | 13 | 1101₂ | 1, 3, 4 |
- & 2 = 0 뜻 : 2번 형질이 비트상에 없으면 결과는 0 / & 2 != 0 형질이 있음.
📌 새로 배운 문법
<-- 이번 문제에서 새로 배운 Java 문법 정리 -->
** 비트마스크(bitmask) **
- 정수형 데이터를 이진수(0, 1)의 묶음으로 표현하고, 이진 연산자(AND, OR, NOT, XOR)를 통해 특정 비트가 켜져 있는지를 검사
- 여러 개의 상태(형질, 옵션, 권한 등)를 한 개의 숫자로 표현할 수 있음. (검사할 때 빠르고 간단한 연산으로 체크 가능)
- 2진수는 항상 오른쪽부터 시작하기 때문에 1번이 오른쪽 끝..
-- GENOTYPE에서 형질 2가 있는지 검사
GENOTYPE & 2 != 0 → 형질 2 있음
GENOTYPE & 2 = 0 → 형질 2 없음
-- 형질 1 또는 3을 가졌는지?
GENOTYPE & 1 != 0 OR GENOTYPE & 4 != 0
'CODING TEST > MySQL' 카테고리의 다른 글
| Lv2 - 동명 동물 수 찾기 (0) | 2025.07.19 |
|---|---|
| Lv1 - 조건에 부합하는 중고거래 댓글 조회하기 (0) | 2025.07.17 |
| Lv1 - 과일로 만든 아이스크림 고르기 (0) | 2025.07.17 |
| Lv1 - 자동차 대여 기록에서 장기/단기 대여 구분하기 (0) | 2025.07.17 |
| Lv1 - 평균 일일 대여 요금 구하기 (0) | 2025.07.16 |
