코딩테스트 업그레이드 할 수 없는 아이템 구하기 풀이 (프로그래머스) MySQL
코딩테스트 연습에 공개된 문제는 (주)그렙이 저작권을 가지고 있습니다.
(지문 하단에 별도 저작권 표시 문제 제외)
코딩테스트 연습 문제의 지문, 테스트케이스, 풀이 등과 같은 정보는 비상업적, 비영리적 용도로 게시할 수 있습니다.
문제 정보
- 프로그래머스
- 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 값을 제외시켜줘야 한다.
댓글 남기기