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

 

프로그래머스

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

programmers.co.kr

코드설명

BIT (&) 연산자 를 활용합니다.

 

문제에서 알아야할점은 3형질이 11(2진수) 가 아니라 100(2진수)라는 것 입니다! 해당 부분만 안다면, 문제를 이해하는데 큰 도움이 됩니다.

 

2 를 2진수로로 변환하면 10 (2진수) 입니다.

1을 2진수로 변환하면 1 (2진수) 입니다.

4를 2진수로 변환하면 100 (2진수) 입니다.

 

이를 활용하여서 GENOTYPE에서 2 형질이 들어가있지 않고, 1의 형질이나 3의 형질이 들어간 GENOTYPE을 찾습니다.

예시로, GENOTYPE이 3인경우를 생각해보겠습니다.

GENOTYPE이 1인경우 2진수로 변환시 1(2진수) 입니다. 이는, 

1 & 10 = 0 입니다. 즉, 2의 형질이 없습니다.

1 & 1 = 1 입니다. 즉 1의 형질 있습니다.

1 & 100 = 0 입니다. 즉 3의 형질이 없습니다.

1이나 3의 형질 두 개중 하나라도 있으면 되기에 GENOTYPE이 1인경우 통과합니다.

 

만약, GENOTYPE이 13인 경우를 살펴봅니다

13 = 1101 (2진수) 입니다.

1101 & 10 = 0000. 즉 2의 형질이 없습니다.

1101 & 1 = 1 입니다. 즉 1의 형질이 있습니다.

1101 & 0100 = 0100 입니다. 즉 3의 형질이 있습니다.

즉, 통과합니다.

 

문제에서 헷갈리는 점은, .아래 부분입니다.

AND ( (ECOLI_DATA.GENOTYPE & 1) = 1 OR (ECOLI_DATA.GENOTYPE & 4) = 4);

왜 % 3 = 3 이 아니라 %4 =4 일까 라는 궁금증이 생깁니다.

이유는, 비교하는 숫자인 4가 2진수 비트연산자에 들어가게 되면 똑같이 0100 으로 바뀌기 때문입니다.

코드

-- 코드를 작성해주세요
SELECT COUNT(*) AS COUNT
FROM ECOLI_DATA
WHERE ECOLI_DATA.GENOTYPE & 2 = 0
AND ( (ECOLI_DATA.GENOTYPE & 1) = 1 OR (ECOLI_DATA.GENOTYPE & 4) = 4);

 

아래와 같이 비트마스킹 및 시프팅을 통해 진행할 수 있습니다.

SELECT COUNT(ED.ID) AS COUNT
FROM ECOLI_DATA AS ED
WHERE 
    ( (ED.GENOTYPE & (1 << 0) > 0 ) OR (ED.GENOTYPE & (1 << 2) > 0 ) ) 
    AND (ED.GENOTYPE & (1 << 1) = 0)

+ Recent posts