Algorithm/Programmers SQL

[MySQL] 프로그래머스 부모의 형질을 모두 가지는 대장균 찾기

제우제우 2024. 9. 7. 01:08

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

 

프로그래머스

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

programmers.co.kr

코딩테스트 연습 > SELECT > 부모의 형질을 모두 가지는 대장균 찾기


문제 분석

난이도: LEVEL2

문제 요구사항

부모의 형질을 모두 보유한 대장균의 ID(ID), 대장균의 형질(GENOTYPE), 부모 대장균의 형질(PARENT_GENOTYPE)을 출력하는 SQL 문을 작성해주세요. 이때 결과는 ID에 대해 오름차순 정렬해주세요.


형질 모두 보유했다?

대장균의 형질(GENOTYPE)은 정수로 주어지지만 이진수로 변환해서 판단해야 한다. 

EX) GENOTYPE = 7 → 111(2) 

GENOTYPE가 7이면 1,2,3 형질을 보유하는 것이다. 

 

형질을 보유했다는 의미를 알았으니까 이제 부모의 형질을 모두 보유했는지 알아내는 법을 생각해야 한다. 

 

부모의 형질을 모두 보유했는지?

부모의 GENOTYPE과 나의 GENOTYPE을 &(AND) 계산했을 때 부모의 GENOTYPE을 모두 가진다. 


 

& 비트 연산 

이진수 1111(2) 100010(2) AND 계산 

 

100010

    1111

000010

 

이런식으로 AND 계산을 한다.


부모의 형질을 모두 보유 X 케이스 

부모  GENOTYPE = 7 나의  GENOTYPE = 10

7 = 111(2) 10 = 1010(2)

 

1010

  111 

0010 부모의 형질을 모두 갖고 있지 않는다. 


부모의 형질을 모두 보유 O 케이스 

부모  GENOTYPE = 5   나의  GENOTYPE = 13

5 = 101(2) 13 = 1101(2)

 

1101

  101

0101 (2) == 101(2) 부모의 형질을 모두 갖고 있는다. 


정답 코드 (SELF 조인 사용) 

SELECT A.ID, A.GENOTYPE, B.GENOTYPE AS PARENT_GENOTYPE
FROM 
ECOLI_DATA A JOIN ECOLI_DATA B
ON A.PARENT_ID = B.ID 
WHERE A.GENOTYPE & B.GENOTYPE = B.GENOTYPE
ORDER BY A.ID