CODING TEST/MySQL

Lv2 - 부모의 형질을 모두 가지는 대장균 찾기

iamyuunzo 2025. 8. 1. 14:52

📌 문제 정보

- 문제 이름 : 프로그래머스 - (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)
부모-자식 관계 대장균, 트리 구조, 댓글
시간 비교 이전/이후 레코드 간 차이 비교