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)
'SQL > 프로그래머스' 카테고리의 다른 글
[SQL][프로그래머스] 카테고리 별 도서 판매량 집계하기 - INNER JOIN + DATE_FORMAT MYSQL (0) | 2024.08.02 |
---|---|
[SQL][프로그래머스] ROOT 아이템 구하기 - INNER JOIN + IS NULL MYSQL (0) | 2024.07.28 |
[SQL][프로그래머스] 최솟값 구하기 - MIN MYSQL ORACLE (0) | 2024.04.30 |
[SQL][프로그래머스] 고양이와 개는 몇 마리 있을까 - UNION + GROUP BY + IN MYSQL ORACLE (0) | 2024.04.30 |
[SQL][프로그래머스] 동명 동물 수 찾기 - GROUP BY + HAVING + COUNT MYSQL ORACLE (0) | 2024.04.30 |