코딩 테스트 연습 문제 코딩테스트 연습에 공개된 문제는 (주)그렙이 저작권을 가지고 있습니다.(지문 하단에 별도 저작권 표시 문제 제외)코딩테스트 연습 문제의 지문, 테스트케이스, 풀이 등과 같은 정보는 비상업적, 비영리적 용도로 게시할 수 있습니다.다만 문제의 지문, 풀이 등과 같은 정보를 단순히 게시하는 것을 넘어, 이를 바탕으로 문제를 풀고 채점이 가능하도록 하는 등의 방식으로 활용하는 것은 제한됩니다. ※ 2020 KAKAO BLIND RECRUITMENT, Summer/Winter Coding 등의 문제는 기업 코딩 테스트에 나온 문제이나, 코딩테스트 연습에 공개된 문제이기 때문에 마찬가지로 비상업적, 비영리적 용도로 게시할 수 있습니다. (2021. 01. 08 업데이트)

문제 정보

  • 프로그래머스
  • MySQL
  • level 2
  • 점수 : 해당 없음
  • 문제 링크

문제

문제 설명 펼치기/접기

문제 설명

대장균들은 일정 주기로 분화하며, 분화를 시작한 개체를 부모 개체, 분화가 되어 나온 개체를 자식 개체라고 합니다.

다음은 실험실에서 배양한 대장균들의 정보를 담은 ECOLI_DATA 테이블입니다. ECOLI_DATA 테이블의 구조는 다음과 같으며, IDPARENT_IDSIZE_OF_COLONYDIFFERENTIATION_DATEGENOTYPE 은 각각 대장균 개체의 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