문제풀이/SQL

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

monawa 2025. 7. 10.
728x90

문제

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

2번 형질이 보유하지 않으면서 1번이나 3번 형질을 보유하고 있는 대장균 개체의 수(COUNT)를 출력하는 SQL 문을 작성해주세요. 1번과 3번 형질을 모두 보유하고 있는 경우도 1번이나 3번 형질을 보유하고 있는 경우에 포함합니다.

풀이

 

select
    count(*) COUNT

from 
    ECOLI_DATA 

where
    (GENOTYPE&2) != 2
    and     ((GENOTYPE & 1) > 0 OR (GENOTYPE & 4) > 0);

어캐해야할지 모르겠어 찾아보니 비트 연산자를 사용해야한다 

 

- & (비트 AND): 두 비트가 모두 1일 때 1 반환.
예시 : 5 & 2 (이진수 101 & 010) → 0 (2번째 비트 확인).

 

이를 통해 GENOTYPE의 2진수 표현에서 2번 형질은 1번 인덱스 비트(값: 2^1 = 2)에 해당하므로 
(GENOTYPE & 2)의 결과가 0이면 2번 형질이 없다는 의미!

1번형질 또는 3번 형질 보유는 

1번 형질은 0번 인덱스 비트(값: 2^0 = 1), 3번 형질은 2번 인덱스 비트(값: 2^2 = 4)에 해당하기에 

같은 방법으로  
(GENOTYPE & 1) > 0 은 1번 형질을 가졌다는 의미
(GENOTYPE & 4) > 0 은 3번 형질을 가졌다는 의미

(GENOTYPE & 1) > 0 이란?

  • 1은 2진수로 ...0001 입니다.
  • & (비트 AND) 연산은 두 숫자의 같은 자리 비트가 모두 1일 때만 1을 반환합니다.
  • GENOTYPE & 1을 계산하면, GENOTYPE의 다른 모든 비트는 0이 되고 오직 첫 번째 비트만 원래 값을 유지합니다.
    • 예시 1: GENOTYPE이 5 (2진수 ...0101) 라면, 0101 & 0001 의 결과는 0001 즉, 1이 됩니다. 1 > 0 이므로 참(True)입니다. → 1번 형질 보유
    • 예시 2: GENOTYPE이 4 (2진수 ...0100) 라면, 0100 & 0001 의 결과는 0000 즉, 0이 됩니다. 0 > 0 이 아니므로 거짓(False)입니다. → 1번 형질 미보유

결론적으로, (GENOTYPE & 1) > 0은 "GENOTYPE이 1번 형질을 가지고 있는가?"를 확인하는 조건문입니다.


(GENOTYPE & 4) > 0 이란?

  • 4는 2진수로 ...0100 입니다.
  • GENOTYPE & 4를 계산하면, GENOTYPE의 세 번째 비트를 제외한 모든 비트는 0이 됩니다.
    • 예시 1: GENOTYPE이 5 (2진수 ...0101) 라면, 0101 & 0100 의 결과는 0100 즉, 4가 됩니다. 4 > 0 이므로 참(True)입니다. → 3번 형질 보유
    • 예시 2: GENOTYPE이 1 (2진수 ...0001) 라면, 0001 & 0100 의 결과는 0000 즉, 0이 됩니다. 0 > 0 이 아니므로 거짓(False)입니다. → 3번 형질 미보유
728x90

댓글