📌 문제 정보
- 문제 이름 : 프로그래머스 - (SELECT) 부모의 형질을 모두 가지는 대장균 찾기
- 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/301647
📌 문제 요약
- 테이블 :
- 부모의 형질을 모두 보유한 대장균의 ID(ID), 대장균의 형질(GENOTYPE), 부모 대장균의 형질(PARENT_GENOTYPE)을 출력하는 SQL 문을 작성해주세요. 이때 결과는 ID에 대해 오름차순 정렬해주세요.
예시)
| ID | PARENT_ID | SIZE_OF_COLONY | DIFFERENTIATION_DATE | GENOTYPE |
| 1 | NULL | 10 | 2019/01/01 | 1 |
| 2 | 1 | 2 | 2019/01/01 | 1 |
| 3 | 1 | 100 | 2020/01/01 | 3 |
| 4 | 2 | 16 | 2020/01/01 | 2 |
| 5 | 4 | 17 | 2020/01/01 | 8 |
| 6 | 3 | 101 | 2021/01/01 | 5 |
| 7 | 2 | 101 | 2022/01/01 | 5 |
| 8 | 6 | 1 | 2022/01/01 | 13 |
각 대장균 별 형질을 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
각 개체별로 살펴보면 다음과 같습니다.
ID 1 : 최초의 대장균 개체이므로 부모가 없습니다.
ID 2 : 부모는 ID 1 이며 부모의 형질인 1번 형질을 보유하고 있습니다.
ID 3 : 부모는 ID 1 이며 부모의 형질인 1번 형질을 보유하고 있습니다.
ID 4 : 부모는 ID 2 이며 부모의 형질인 1번 형질을 보유하고 있지 않습니다.
ID 5 : 부모는 ID 4 이며 부모의 형질인 2번 형질을 보유하고 있지 않습니다.
ID 6 : 부모는 ID 3 이며 부모의 형질 1, 2번 중 2 번 형질을 보유하고 있지 않습니다.
ID 7 : 부모는 ID 2 이며 부모의 형질인 1번 형질을 보유하고 있습니다.
ID 8 : 부모는 ID 6 이며 부모의 형질 1, 3번을 모두 보유하고 있습니다.
따라서 부모의 형질을 모두 보유한 개체는 ID 2, ID 3, ID 7, ID 8
출력)
| ID | GENOTYPE | PARENT_GENOTYPE |
| 2 | 1 | 1 |
| 3 | 3 | 1 |
| 7 | 5 | 1 |
| 8 | 13 | 5 |
📌 내 풀이 및 코드
SELECT
child.ID, -- 자식 ID
child.GENOTYPE, -- 자식 형질
parent.GENOTYPE AS PARENT_GENOTYPE -- 부모 형질
FROM ECOLI_DATA AS child
JOIN ECOLI_DATA AS parent
ON child.PARENT_ID = parent.ID -- 자식과 부모 테이블을 자기참조 JOIN
WHERE
(child.GENOTYPE & parent.GENOTYPE) = parent.GENOTYPE
-- 부모가 가진 형질이 자식에게 모두 있는 경우만 선택
ORDER BY child.ID ASC; -- ID 오름차순 정렬
- 테이블이 1개인데 그 자신 테이블도 조인을 할 수 있다는 것을 몰랐음.
- 비트로 표현된 형질이라는 개념이 생소해서 문제가 이해가 안됐고, 2진수에서 1이면 그 형질을 가진것, 0이면 그 형질을 가지지 않은 것을 이해하는데 시간이 좀 걸렸던 것 같음.
📌 새로 배운 문법
<-- 이번 문제에서 새로 배운 Java 문법 정리 -->
** 자기조인 (Self-JOIN) **
- 한 테이블 안에 있는 행들끼리 관계가 있을 때, 같은 테이블을 2개처럼 JOIN해서 비교하거나 연결하는 방법.
- 같은 테이블을 두 번 불러서 비교하고 별칭이 필수임.
SELECT ... FROM 테이블명 AS A
JOIN 테이블명 AS B ON A.컬럼 = B.컬럼
- 자기조인이 필요한 이유? 부모 정보가 같은 테이블에 들어 있을 때 꼭 필요.
| 상하관계 | 직원과 상사 (employee.MANAGER_ID = employee.ID) |
| 부모-자식 관계 | 대장균, 트리 구조, 댓글 |
| 시간 비교 | 이전/이후 레코드 간 차이 비교 |
'CODING TEST > MySQL' 카테고리의 다른 글
| Lv2 - 연도별 대장균 크기의 편차 구하기 (0) | 2025.08.01 |
|---|---|
| Lv2 - 분기별 분화된 대장균의 개체 수 구하기 (0) | 2025.08.01 |
| Lv2 - 노션별 평균 역 사이 거리 조회하기 (0) | 2025.08.01 |
| Lv2 - 조건에 맞는 사원 정보 조회하기 (0) | 2025.08.01 |
| Lv2 - 조건에 맞는 개발자 찾기 (0) | 2025.07.30 |
