Loading [MathJax]/jax/output/CommonHTML/jax.js

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⑵

자릿수 23 22 21 20
형질 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

댓글