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
'코딩테스트 > SQL 코드카타' 카테고리의 다른 글
MySQL 프로그래머스 | 특정 세대의 대장균 찾기 (재귀쿼리로 자식 세대 구하기) (0) | 2024.10.16 |
---|---|
MySQL 프로그래머스 | 대장균의 크기에 따라 분류하기 2 (PERCENT_RANK 함수 사용) (1) | 2024.10.11 |
MySQL 프로그래머스 | 특정 형질을 가지는 대장균 찾기 (비트연산자 활용) (1) | 2024.10.08 |
MySQL 프로그래머스 | 언어별 개발자 분류하기 (GROUP_CONCAT, FIND_IN_SET 함수) (2) | 2024.09.30 |
MySQL 프로그래머스 | 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (2) | 2024.09.25 |
댓글