[프로그래머스/MySQL/SELECT/LV.1] 특정 형질을 가지는 대장균 찾기

sammy·2024년 8월 21일

SQL 문제풀이

목록 보기
75/87

문제

문제 설명

대장균들은 일정 주기로 분화하며, 분화를 시작한 개체를 부모 개체, 분화가 되어 나온 개체를 자식 개체라고 합니다.
다음은 실험실에서 배양한 대장균들의 정보를 담은 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

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges

✔️  문제접근

개인적으로 비트를 사용해서 해결해야 하는 문제이기 때문에, Lv.1 문제라고는 생각되지 않았습니다 🧐
문제를 순차적으로 해결해 보기 위해 문제에서 제시한 조건을 나열해보았습니다.
(🚨 복잡하다고 생각하는 문제는 꼭 설계를 먼저 하고 풀이에 들어가야 합니다.)

🌱 조건

  1. 2번 형질을 보유하지 않는다.
    • 비트 연산으로 2번 형질은 10(2) 즉,숫자 2이므로, 2와 GENOTYPE 컬럼을 & 연산해서 결과가 0이 나오는 조건을 작성한다.
  2. 1번과 3번 형질을 보유해야 한다.(둘다 보유해도 괜찮음)
    • 1번 형질은 숫자 1(2), 3번 형질은 100(2) 즉, 숫자 1과 4를 의미한다. 그렇다면, 둘다 포함하는 경우는 101(2) 즉, 숫자 5가 된다.
    • 이들을 포함하는 숫자인 5와 GENOTYPE 컬럼을 & 연산해서 결과가 [1,4,5] 안에 있는지만 확인하면 된다.

⭐️   내 정답

SELECT COUNT(*) AS "COUNT"
FROM ECOLI_DATA
WHERE (2 & GENOTYPE = 0) AND (5 & GENOTYPE ) in (1, 4, 5);
profile
누군가에게 도움을 주기 위한 개발자로 성장하고 싶습니다.

0개의 댓글