CODING TEST/MySQL

Lv1 - 특정 형질을 가지는 대장균 찾기

iamyuunzo 2025. 7. 17. 14:38

📌 문제 정보

- 문제 이름 : 프로그래머스 - (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