문제
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번 형질 미보유
'문제풀이 > SQL' 카테고리의 다른 글
부서별 평균 연봉 조회하기 (0) | 2025.07.14 |
---|---|
조건에 맞는 사원 정보 조회하기 (0) | 2025.07.14 |
특정 세대의 대장균 찾기 (0) | 2025.07.10 |
대장균의 크기에 따라 분류하기 1 (0) | 2025.07.04 |
대장균들의 자식의 수 구하기 (0) | 2025.07.03 |
댓글