MySQL 프로그래머스 | 특정 형질을 가지는 대장균 찾기 (비트연산자 활용)

    728x90

     

    문제

    https://school.programmers.co.kr/learn/courses/30/lessons/301646

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr

    • 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)인 결과가 나오도록 조건을 설정하면 됨 

    # 1번 형질과 3번 형질을 보유하고 있어야 함

    • 비트연산자(&)로 GENOTYPE이 1이거나 3인 경우 조회하기
    • 앞서 말했듯이 1번 형질의 보유 여부$2^0$의 자릿수에서,
      3번 형질의 보유 여부$2^2$의 자릿수에서 찾아야 함
      • 그래서 GENOTYPE & 1 또는 GENOTYPE & 4 인 조건을 주고,
        이진수의 각 자리에 1번과 3번 형질이 존재하는 경우(1이 있는 경우)만 필터링되게 함

    # 정답 

    1
    2
    3
    4
    SELECT COUNT(ID) COUNT
    FROM ECOLI_DATA
    WHERE (GENOTYPE & 2= 0
    AND ((GENOTYPE & 1) OR (GENOTYPE & 4))
    cs

     

     

     

     

    728x90

    댓글