코딩테스트/SQL

[프로그래머스][MySQL] Lv. 1 특정 형질을 가지는 대장균 찾기

_알파카 2024. 7. 9. 23:38
728x90

문제 설명

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

 

프로그래머스

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

programmers.co.kr

 

문제에서 주어진 ECOLI_DATA 테이블은 다음과 같은 값을 갖고 있다. 

ID 대장균 개체의 ID 
PARENT_ID 부모 개체의 ID
SIZE_OF_COLONY 개체의 크기
DIFFERENTIATION_DATE 분화되어 나온 날짜
GENOTYPE 개체의 형질


이때, 문제에서 주어진 조건은 아래와 같다. 


- 최초의 대장균 개체의 PARENT_ID 는 NULL 값
- 2번 형질이 보유하지 않으면서
- 1번이나 3번 형질을 보유하고 있는
- 대장균 개체의 수(COUNT)
- 1번과 3번 형질을 모두 보유하고 있는 경우도 1번이나 3번 형질을 보유하고 있는 경우에 포함

 

개념 설명

이 문제를 푸는데 핵심인 2진수 개념을 이해하기 힘들어서, 정리해보았다. 

대장균의 형질(genotype)은 2진수로 표현된 숫자이며, 각 비트는 특정 형질의 보유 여부를 나타낸다. 

예를 들어, 2진수에서 1의 자리는 1번 형질, 2의 자리는 2번 형질, 4의 자리는 3번 형질, 8의 자리는 4번 형질을 나타낸다. 

즉, 형질의 2진수 표현과 우리가 흔히 사용자는 10진수 표현은 다음과 같다!

대장균의 형질 2진수 숫자 10진수 숫자
1번 형질 0001 1
2번 형질 0010 2
3번 형질 0100 4
4번 형질 1000 8

 

 

이제, 문제에서 주어진 예시 데이터를 확인해보자. 

각 ID의 대장균 형질(genotype)을 2진수로 나타내면..

ID 대장균의 형질 2진수 숫자 10진수 숫자 보유한 형질
1 8번 형질 1000 8 4 (네 번째 비트가 1)
2 15번 형질 1111 15 1, 2, 3, 4 (모든 비트가 1)
3 1번 형질 0001 1 1 (첫 번째 비트가 1)
4 13번 형질 1101 13 1, 3, 4 (첫 번째, 세 번째, 네 번째 비트가 1)

 

이 되는 것이다. 

 

내 풀이

SELECT COUNT(*) as COUNT
FROM ECOLI_DATA
WHERE (GENOTYPE & 2) = 0 -- 2번 형질이 없음
  AND (GENOTYPE & 1 > 0 OR GENOTYPE & 4 > 0); -- 1번 또는 3번 형질을 보유

 

느낀점

비트 연산은 항상 너무 어려운 것 같다. 해도해도 복잡하고 어렵다.

728x90