부모의 형질을 모두 가지는 대장균 찾기

비트 연산자
Seo Jimin's avatar
Mar 10, 2026
부모의 형질을 모두 가지는 대장균 찾기

문제 링크

개념

& 연산자

&는 비트 단위 AND연산자다.
정수값을 2진수로 변환한 뒤, 자릿수 기준으로 각 비트를 하나씩 비교하여 결과를 낸다.(길이가 다르면 왼쪽에 0으로 패딩을 준다.) 같은 위치가 두 수 다 1이면 1을 반환하고 아니면 0을 반환한다.
101 & 101 ----- 101 1 & 11 0 & 00 1 & 11
0101 & 1101 ------ 0101 0 & 10 1 & 11 0 & 00 1 & 11

문제에 적용하면…

부모의 형질을 모두 보유한 대장균에 한에 SELECT를 해야한다.
자식의 대장균 관련 데이터 외에도 부모의 대장균의 형질도 SELECT할 때 필요하므로 JOIN을 사용한다.
FROM ECOLI_DATA c JOIN ECOLI_DATA p ON c.PARENT_ID = p.ID
이제 필요한 데이터는 다 준비되었다.
notion image
notion image
2진수로 나타냈을 때 같은 값이 나타난다면, 보유한 형질이 같다는 사실을 알 수 있다.
따라서 부모의 형질을 모두 보유했는지의 여부를 확인하려면 자식의 대장균의 형질과 부모의 대장균의 형질을 &연산자로 계산했을 때 부모의 대장균의 형질과 똑같게 나오면 된다.
그리고 문제에서 ID에 대해 오름차순으로 정렬해달라고 했으므로 ORDER BY로 정렬해준다. (기존의 정렬 기준은 다른 컬럼일 수도 있기 때문에 기본값이 오름차순이라고 ORDER BY를 생략해서는 안 된다.)
 

확장 개념

  1. |
    1. OR 연산자로, 두 수 같은 자리의 비트가 둘 중 하나라도 1이면 1을 반환하고 아니면 0을 반환한다.
  1. ^
    1. XOR 연산자로, 두 수 같은 자리의 비트가 서로 다른 값이면 1을 반환하고 아니면 0을 반환한다.
  1. ~
    1. NOT 연산자로, 하나의 데이터의 비트를 모두 반전시킨다. 1은 0으로, 0은 1로 반전.
      SELECT ~3 -------------------- 18446744073709552000 => 컴퓨터 시스템에서 모든 정수는 64비트의 2진수로 표현되므로 300...011이다. 이에 NOT연산자를 사용하면 11...100이 된다.(끝의 두자리만 0이고 나머지 62자리는 1) 이렇게 나온 결과값인 11...10010진수로 변환한 것이 위의 결과값이다.
  1. >>(Right shift), <<(Left shift)
    1. 모든 비트를 왼쪽, 오른쪽으로 지정된 수만큼 이동시킨다. 이 때, 이동하며 새로 생긴 비트는 0으로 채워진다.
💡
MySQL에서는 0과 1로 이루어진 문자열 앞에 b(bit)를 붙여 2진수를 표현할 수 있다. ex) b’011’=3, b’110 =6 ex) SELECT B'011' & B'110';
------------------------
2

비트 연산자의 장점

  1. 빠르다.
    1. : 연산 속도는 비트 연산 > 숫자 연산 > 문자 연산
      이는 비트 연산자가 하드웨어 수준에서 지원되기 때문이며, 복잡한 수학 연산보다 훨씬 적은 사이클을 사용한다.
  1. 메모리를 절약할 수 있다.
    1. : 메모리 사용량이 중요한 임베디드 시스템이나 모바일 어플리케시연에서 유용하다.
  1. 복잡한 코드를 간결하게 표현할 수 있다.
    1. : 가독성, 관리 측면에서 좋다.
 

제출 답안

SELECT c.ID, c.GENOTYPE, p.GENOTYPE AS PARENT_GENOTYPE FROM ECOLI_DATA c JOIN ECOLI_DATA p ON c.PARENT_ID = p.ID WHERE (c.GENOTYPE & p.GENOTYPE) = p.GENOTYPE ORDER BY c.ID;
 
 

참고 자료
Share article

miniiya