SQL 관련 이진수 풀이 정리

SeongGyun Hong·2025년 3월 7일

SQL

목록 보기
48/51

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

1. 이진법과 형질의 표현

  • 이진법(Binay System):
    이진법은 01만을 사용하는 숫자 체계로써,
    예를 들어 13이라는 십진수는 이진법으로 1101로 나타남.

  • 형질과 비트 위치:
    보통 각 형질은 이진수의 각 자리(비트)에 대응되는데 (오른쪽부터 1번째, 2번째, 3번째, 4번째 …)

    • 형질 1: 1번째 비트 (값 1)
    • 형질 2: 2번째 비트 (값 2)
    • 형질 3: 3번째 비트 (값 4)
    • 형질 4: 4번째 비트 (값 8)
      등으로 각 자리가 2의 거듭제곱 값을 갖게 됨.
  • 예시:

    • ID 1의 GENOTYPE이 8이면, 이진법으로 1000 → 형질 4만 보유
    • ID 2의 GENOTYPE이 15이면, 이진법으로 1111 → 형질 1, 2, 3, 4 모두 보유
    • ID 3의 GENOTYPE이 1이면, 이진법으로 0001 → 형질 1만 보유
    • ID 4의 GENOTYPE이 13이면, 이진법으로 1101 → 형질 1, 3, 4 보유

2. 비트 연산과 조건 검증

MS SQL SERVER, MySQL 에서는 비트 AND 연산자(&) 혹은 오라클에서는 BITAND 함수를 사용하여 이진법으로 저장된 형질 값을 확인할 수 있음.

(A) (GENOTYPE & 5) > 0

  • 5의 이진 표현:
    5는 이진법으로 0101 (앞에서부터 4자리로 표현하면)
    → 여기서 1번째 비트(값 1)와 3번째 비트(값 4)가 1임을 의미.

  • 연산 의미:
    (GENOTYPE & 5) 는 GENOTYPE의 이진 표현과 0101의 각 비트를 비교하여 둘 다 1인 자리의 값을 반환

    • 결과가 0보다 크다는 것:
      이는 GENOTYPE에 형질 1 (값 1) 또는 형질 3 (값 4) 중 최소 하나가 포함되어 있음을 의미
    • 예시:
      • ID 4의 경우 GENOTYPE 13은 이진법으로 1101

        
           1101   (13)
        &  0101   (5)
        --------
           0101   (5)  → 5 > 0, 조건 만족
      • ID 1의 경우 GENOTYPE 8은 이진법으로 1000

        
           1000   (8)
        &  0101   (5)
        --------
           0000   (0)  → 조건 불만족

(B) (GENOTYPE & 2) = 0

  • 2의 이진 표현:
    2는 이진법으로 0010
    → 2번째 비트만 1. 즉, 형질 2를 의미

  • 연산 의미:
    (GENOTYPE & 2)는 GENOTYPE과 0010을 비교해서 2번째 비트가 1이면 2를 반환하고, 1이 아니면 0을 반환

    • 결과가 0이라는 것:
      이는 GENOTYPE에 형질 2가 포함되어 있지 않음을 의미
    • 예시:
      • ID 2의 경우 GENOTYPE 15는 이진법으로 1111

        
           1111   (15)
        &  0010   (2)
        --------
           0010   (2)  → 2 ≠ 0, 조건 불만족
      • ID 4의 경우 GENOTYPE 13은 이진법으로 1101

        
           1101   (13)
        &  0010   (2)
        --------
           0000   (0)  → 조건 만족

3. 문제 조건에 맞게 조합하기

문제에서 요구하는 조건은 "2번 형질이 없는(즉, (GENOTYPE & 2) = 0) 대장균 중, 1번 또는 3번 형질이 있는 경우(즉, (GENOTYPE & 5) > 0)를 찾아 그 개수를 출력"하는 것

  • (GENOTYPE & 2) = 0:
    → 대장균에 형질 2가 없음을 확인하고

  • (GENOTYPE & 5) > 0:
    → 대장균에 형질 1(값 1) 또는 형질 3(값 4) 또는 둘 다 있는 경우 조건에 부합하도록 함.
    (5는 1과 4의 합이며, 이진법으로 보면 0101로 두 자리가 1인 값임.)

즉, 이 조건들을 결합하면 형질 2는 없어야 하면서, 형질 1 또는 3 중 하나 이상을 보유한 대장균 개체만 선택됨.


4. 결론

SQL 쿼리에서는 다음과 같이 조건을 구현할 수 있음.

  • MS SQL Server: (MySQL도 동일)

    SELECT COUNT(ID) AS COUNT
    FROM ECOLI_DATA 
    WHERE (GENOTYPE & 5) > 0
      AND (GENOTYPE & 2) = 0;
  • 오라클의 경우 (비트 연산 함수 사용):

    SELECT COUNT(ID) AS COUNT
    FROM ECOLI_DATA
    WHERE BITAND(GENOTYPE, 5) > 0
      AND BITAND(GENOTYPE, 2) = 0;
profile
헤매는 만큼 자기 땅이다.

0개의 댓글