코딩테스트 연습에 공개된 문제는 (주)그렙이 저작권을 가지고 있습니다.
(지문 하단에 별도 저작권 표시 문제 제외)
코딩테스트 연습 문제의 지문, 테스트케이스, 풀이 등과 같은 정보는 비상업적, 비영리적 용도로 게시할 수 있습니다.
문제 정보
- 프로그래머스
- 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_ID
, ITEM_NAME
, RARITY
, PRICE
는 각각 아이템 ID, 아이템 명, 아이템의 희귀도, 아이템의 가격을 나타냅니다.
Column name | Type | Nullable |
---|---|---|
ITEM_ID | INTEGER | FALSE |
ITEM_NAME | VARCHAR(N) | FALSE |
RARITY | INTEGER | FALSE |
PRICE | INTEGER | FALSE |
ITEM_TREE
테이블은 다음과 같으며, ITEM_ID
, PARENT_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 값을 제외시켜줘야 한다.