코딩테스트 연습에 공개된 문제는 (주)그렙이 저작권을 가지고 있습니다.
(지문 하단에 별도 저작권 표시 문제 제외)
코딩테스트 연습 문제의 지문, 테스트케이스, 풀이 등과 같은 정보는 비상업적, 비영리적 용도로 게시할 수 있습니다.

문제 정보

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

문제

어느 한 게임에서 사용되는 아이템들은 업그레이드가 가능합니다.
‘ITEM_A’->’ITEM_B’와 같이 업그레이드가 가능할 때
‘ITEM_A’를 ‘ITEM_B’의 PARENT 아이템, PARENT 아이템이 없는 아이템을 ROOT 아이템이라고 합니다.
예를 들어 ‘ITEM_A’->’ITEM_B’->’ITEM_C’ 와 같이 업그레이드가 가능한 아이템이 있다면
‘ITEM_C’의 PARENT 아이템은 ‘ITEM_B’
‘ITEM_B’의 PARENT 아이템은 ‘ITEM_A’
ROOT 아이템은 ‘ITEM_A’가 됩니다.

다음은 해당 게임에서 사용되는 아이템 정보를 담은 ITEM_INFO 테이블과 아이템 관계를 나타낸 ITEM_TREE 테이블입니다.
ITEM_INFO 테이블은 다음과 같으며, ITEM_IDITEM_NAMERARITYPRICE는 각각 아이템 ID, 아이템 명, 아이템의 희귀도, 아이템의 가격을 나타냅니다.

Column name Type Nullable
ITEM_ID INTEGER FALSE
ITEM_NAME VARCHAR(N) FALSE
RARITY INTEGER FALSE
PRICE INTEGER FALSE

ITEM_TREE 테이블은 다음과 같으며, ITEM_IDPARENT_ITEM_ID는 각각 아이템 ID, PARENT 아이템의 ID를 나타냅니다.

Column name Type Nullable
ITEM_ID INTEGER FALSE
PARENT_ITEM_ID INTEGER TRUE

단, 각 아이템들은 오직 하나의 PARENT 아이템 ID 를 가지며, ROOT 아이템의 PARENT 아이템 ID 는 NULL 입니다.

ROOT 아이템이 없는 경우는 존재하지 않습니다.

더 이상 업그레이드할 수 없는 아이템의 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력하는 SQL 문을 작성해 주세요. 이때 결과는 아이템 ID를 기준으로 내림차순 정렬해 주세요.

풀이 코드

1
2
3
4
5
6
7
8
9
10
11
-- 출력 : ITEM_ID, ITEM_NAME, RARITY
SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO
-- 조건 : 누군가의 PARENT가 아닌 경우를 출력
WHERE ITEM_ID NOT IN (
    SELECT PARENT_ITEM_ID
    FROM ITEM_TREE
    -- NULL 값이 포함되어있으므로, NULL이 아닌 것만 비교
    WHERE PARENT_ITEM_ID IS NOT NULL)
-- 결과는 아이템ID를 기준으로 내림차순 정렬
ORDER BY ITEM_ID DESC

풀이 방식

이 문제의 핵심은 NOT IN 조건을 사용할 때 NULL 값이 포함된 경우를 어떻게 처리할 것인가 이다.

ITEM_INFO 테이블의 ITEM_ID 는 NonNullable 이지만, 이와 포함여부를 비교해야하는 ITEM_TREE 테이블의 PARENT_ITEM_ID는 Nullable이다.

이렇게 Null이 포함된 Column에 IN 또는 NOT IN 조건을 사용하기 위해서는 Null 값을 제외시켜줘야 한다.

Reference

https://studyingazae.tistory.com/189