MySQL 프로그래머스 | 부모의 형질을 모두 가지는 대장균 찾기 (비트연산자, IN 활용)

    728x90

     

    문제

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

     

    프로그래머스

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

    programmers.co.kr

    • 부모의 형질을 모두 보유한 대장균의 ID(ID), 대장균의 형질(GENOTYPE), 부모 대장균의 형질(PARENT_GENOTYPE)을 출력하는 SQL문 작성
    • 결과는 ID 기준 오름차순 정렬

     

    테이블

    ECOLI_DATA
    • 각 대장균 별 형질 2진수
      ID 1 : 1₍₂₎
      ID 2 : 1₍₂₎
      ID 3 : 11₍₂₎
      ID 4 : 10₍₂₎
      ID 5 : 1000₍₂₎
      ID 6 : 101₍₂₎
      ID 7 : 101₍₂₎
      ID 8 : 1101₍₂₎
    • 각 대장균 별 보유한 형질
      ID 1 : 1
      ID 2 : 1
      ID 3 : 1, 2
      ID 4 : 2
      ID 5 : 4
      ID 6 : 1, 3
      ID 7 : 1, 3
      ID 8 : 1, 3, 4
    •  두 내용을 종합해보면, 
      GENOTYPE 이진수를 보고, 1~4번까지 각 형질의 유무를 확인할 수 있음

     

    GENOTYPE이 13인 경우, 이진수는 1101⑵

    자릿수 $ 2^3 $ $ 2^2 $ $ 2^1 $ $ 2^0 $
    형질 4번 형질  3번 형질  2번 형질 1번 형질
    이진수 1 1 0 1

    → GENOTYPE이 13이면 1번, 3번, 4번 형질을 가지고 있는 것.

     

    풀이과정

    # ECOLI_DATA 테이블끼리 조인

    • 자신의 자식 정보를 같은 행에서 확인하기 위해 ECOLI_DATA 테이블끼리 조인함.
      • E1 테이블에서는 자신에 대한 정보를, E2 테이블에서는 자식 정보를 확인할 수 있음. 
      • 자신의 ID를 부모로 둔,
        즉, 자신의 ID를 PARENT_ID로 둔 데이터를 LEFT JOIN 해줌. 
    1
    2
    3
    SELECT *
    FROM ECOLI_DATA E1
    LEFT JOIN ECOLI_DATA E2 ON E1.ID = E2.PARENT_ID
    cs

     

     

    # 부모 형질을 모두 가진 자식 찾기

    • WHERE절에서 비트연산자(&)를 사용해 자신과 자식의 GENOTYPE을 비교했을 때
      형질이 겹치는 게 있어야 함
    • 단, 문제에서 부모의 형질을 모두 보유한 자식을 찾고 있으므로
      IN함수를 이용해 겹치는 형질이 모두 부모의 GENOTYPE에 속해 있어야 한다는 조건을 추가함

     

    # 정답

    • 문제에서 요구한 행 조회 + 정렬조건만 추가해주면 끝!
    1
    2
    3
    4
    5
    SELECT E2.ID, E2.GENOTYPE, E1.GENOTYPE PARENT_GENOTYPE
    FROM ECOLI_DATA E1
    LEFT JOIN ECOLI_DATA E2 ON E1.ID = E2.PARENT_ID
    WHERE (E2.GENOTYPE & E1.GENOTYPE) IN(E1.GENOTYPE)
    ORDER BY E2.ID
    cs

     

     

     

    728x90

    댓글