코딩 테스트 연습 문제 코딩테스트 연습에 공개된 문제는 (주)그렙이 저작권을 가지고 있습니다.(지문 하단에 별도 저작권 표시 문제 제외)코딩테스트 연습 문제의 지문, 테스트케이스, 풀이 등과 같은 정보는 비상업적, 비영리적 용도로 게시할 수 있습니다.다만 문제의 지문, 풀이 등과 같은 정보를 단순히 게시하는 것을 넘어, 이를 바탕으로 문제를 풀고 채점이 가능하도록 하는 등의 방식으로 활용하는 것은 제한됩니다. ※ 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 문제는 왜 점수를 주지 않는 걸까?
Comments