코딩테스트 부모의 형질을 모두 가지는 대장균 찾기 풀이 (프로그래머스) MySQL
코딩 테스트 연습 문제 코딩테스트 연습에 공개된 문제는 (주)그렙이 저작권을 가지고 있습니다.(지문 하단에 별도 저작권 표시 문제 제외)코딩테스트 연습 문제의 지문, 테스트케이스, 풀이 등과 같은 정보는 비상업적, 비영리적 용도로 게시할 수 있습니다.다만 문제의 지문, 풀이 등과 같은 정보를 단순히 게시하는 것을 넘어, 이를 바탕으로 문제를 풀고 채점이 가능하도록 하는 등의 방식으로 활용하는 것은 제한됩니다. ※ 2020 KAKAO BLIND RECRUITMENT, Summer/Winter Coding 등의 문제는 기업 코딩 테스트에 나온 문제이나, 코딩테스트 연습에 공개된 문제이기 때문에 마찬가지로 비상업적, 비영리적 용도로 게시할 수 있습니다. (2021. 01. 08 업데이트)
문제 정보
- 프로그래머스
- MySQL
- level 2
- 점수 : 해당 없음
- 문제 링크
문제
문제 설명 펼치기/접기
문제 설명
대장균들은 일정 주기로 분화하며, 분화를 시작한 개체를 부모 개체, 분화가 되어 나온 개체를 자식 개체라고 합니다.
다음은 실험실에서 배양한 대장균들의 정보를 담은 ECOLI_DATA 테이블입니다. ECOLI_DATA 테이블의 구조는 다음과 같으며, ID, PARENT_ID, SIZE_OF_COLONY, DIFFERENTIATION_DATE, GENOTYPE 은 각각 대장균 개체의 ID, 부모 개체의 ID, 개체의 크기, 분화되어 나온 날짜, 개체의 형질을 나타냅니다.
| Column name | Type | Nullable |
|---|---|---|
| ID | INTEGER | FALSE |
| PARENT_ID | INTEGER | TRUE |
| SIZE_OF_COLONY | INTEGER | FALSE |
| DIFFERENTIATION_DATE | DATE | FALSE |
| GENOTYPE | INTEGER | FALSE |
최초의 대장균 개체의 PARENT_ID 는 NULL 값입니다.
문제
부모의 형질을 모두 보유한 대장균의 ID(ID), 대장균의 형질(GENOTYPE), 부모 대장균의 형질(PARENT_GENOTYPE)을 출력하는 SQL 문을 작성해주세요. 이때 결과는 ID에 대해 오름차순 정렬해주세요.
예시
예를 들어 ECOLI_DATA 테이블이 다음과 같다면
| 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 |
각 대장균 별 형질과 부모 형질과의 비교를 표로 나타내면 아래와 같습니다.
| ID | 형질(2진수) | 보유 형질 | 부모 ID | 부모 형질 보유 여부 | 부모 형질 모두 보유 |
|---|---|---|---|---|---|
| 1 | 1₂ | 1 | 없음 | 해당 없음 | 해당 없음 |
| 2 | 1₂ | 1 | 1 | 1번 형질 보유 | O |
| 3 | 11₂ | 1, 2 | 1 | 1번 형질 보유 | O |
| 4 | 10₂ | 2 | 2 | 1번 형질 미보유 | X |
| 5 | 1000₂ | 4 | 4 | 2번 형질 미보유 | X |
| 6 | 101₂ | 1, 3 | 3 | 2번 형질 미보유 | X |
| 7 | 101₂ | 1, 3 | 2 | 1번 형질 보유 | O |
| 8 | 1101₂ | 1, 3, 4 | 6 | 1·3번 형질 모두 보유 | O |
따라서 부모의 형질을 모두 보유한 개체는 ID 2, ID 3, ID 7, ID 8 이며 결과를 ID 에 대해 오름차순 정렬하면 다음과 같아야 합니다.
| ID | GENOTYPE | PARENT_GENOTYPE |
|---|---|---|
| 2 | 1 | 1 |
| 3 | 3 | 1 |
| 7 | 5 | 1 |
| 8 | 13 | 5 |
풀이
풀이 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 코드를 작성해주세요
-- 출력할 컬럼 : ID, GENOTYPE, PARENT_GENOTYPE
-- 정렬 : ORDER BY ID ASC
-- 형절 : 2진수 가장 낮은 자릿수부터 1번 형질, 2번 형질... (1:보유)
-- 이진수를 기준으로 동일한 부분을 체크하기 위해서는 비트 & 연산을 수행
SELECT
child.ID ID
, child.GENOTYPE GENOTYPE
, parent.GENOTYPE PARENT_GENOTYPE
FROM ECOLI_DATA child
JOIN ECOLI_DATA parent
ON child.PARENT_ID = parent.ID
WHERE (child.GENOTYPE & parent.GENOTYPE) = parent.GENOTYPE -- 비트연산
ORDER BY child.ID
풀이 방식
서로 다른 두 숫자 간 비트 AND 연산을 하면, 동일한 이진수 부분만이 반환되는 비트 마스킹을 이용해 풀이하였다.
리뷰

SQL 문제는 왜 점수를 주지 않는 걸까?
댓글 남기기