[프로그래머스 | SQL] 특정 형질을 가지는 대장균 찾기

박기영·2024년 8월 2일
0

프로그래머스

목록 보기
146/159

solution

SELECT COUNT(ID) AS COUNT
FROM ECOLI_DATA
WHERE GENOTYPE & 2 = 0
    AND (GENOTYPE & 4 >= 1 OR GENOTYPE & 1 >= 1);

explanation

ECOLI_DATA 테이블에서
ID의 개수(COUNT())를 COUNT라는 컬럼명으로 추출한다.

GENOTYPE은 10진수로,
이를 2진수로 변경했을 때 자릿수를 n번 형질이라고 정의한다.

예를 들면 다음과 같이 표현 가능하다.

10진수 : 8
2진수 : 0100

3번 형질이 존재함.

이런 연산을 진행하기 위해서 비트 연산자를 사용하는 방법을 취할 수 있다.

GENOTYPE이 8이라고 할 때, GENOTYPE & 2를 표현하면 아래와 같다.

GENOTYPE(10진수) : 8
=> GENOTYPE(2진수) : 0100

2(10진수)
=> 0010(2진수)

--- 비트 연산 ---

  0100
& 0010
-------
  0000(2진수)
=> 0(10진수) === 최종 연산 결과

& 연산자의 경우 비트가 모두 1인 경우에만 1이 된다.
따라서, 특정 형질이 존재하는지 여부를 판단하는 연산에 사용될 수 있다.
위 예시의 경우, 8이라는 GENOTYPE은 2번 형질을 가지지 않는다는 것을 확인할 수 있다.

따라서,
GENOTYPE & 2 = 0은 2번 형질이 없는 경우를 의미하고,
GENOTYPE & 4 >= 1은 1번 형질이 있는 경우를 의미한다.

여기서,
= 1이 아니라 >= 1인지 의문이 들 수 있다.
그렇다면, 비트 연산자가 어떤 결과를 내는지 이해해야한다.

GENOTYPE(10진수) : 15
=> GENOTYPE(2진수) : 1111

4(10진수)
=> 0100(2진수)

--- 비트 연산 ---

  1111
& 0100
-------
  0100(2진수)
=> 4(10진수) === 최종 연산 결과

위 예시를 보고 GENOTYPE & 2 = 0를 다시 보면,
= 0은 해당 비트 자리수가 0이라는 것이 아니라 비트 연산의 결과값(10진수)이 0이라는 것을 알 수 있다.

따라서,
GENOTYPE & 4 >= 1을 바꿔말하면
GENOTYPE & 4 = 4가 될 수 있다.

또한, 같은 방법으로
GENOTYPE & 1 >= 1을 바꿔말하면
GENOTYPE & 1 = 1가 될 수 있다.

GENOTYPE & 2 = 0를 설명하자면,
2(10진수)0010(2진수)이므로
두 번째 자릿수 외에는 전부 & 연산을 통해 0이 되며,
2번 형질마저 없으면(두 번째 자릿수 비트가 0이면)
비트 연산 결과, 모든 자릿수가 0이 되어 결과값이 0000(2진수),
즉, 0(10진수)이 되는 것이다.

profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글