2024. 9. 28. 18:00ㆍSQL 고득점 Kit/SELECT
https://school.programmers.co.kr/learn/courses/30/lessons/273711
문제 설명
어느 한 게임에서 사용되는 아이템들은 업그레이드가 가능합니다.
- '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 아이템이 없는 경우는 존재하지 않습니다.
문제
아이템의 희귀도가 'RARE'인 아이템들의 모든 다음 업그레이드 아이템의 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력하는 SQL 문을 작성해 주세요. 이때 결과는 아이템 ID를 기준으로 내림차순 정렬주세요.
예시
예를 들어 ITEM_INFO 테이블이 다음과 같고
ITEM_ID | ITEM_NAME | RARITY | PRICE |
0 | ITEM_A | RARE | 10000 |
1 | ITEM_B | RARE | 9000 |
2 | ITEM_C | LEGEND | 11000 |
3 | ITEM_D | RARE | 10000 |
4 | ITEM_E | RARE | 12000 |
ITEM_TREE 테이블이 다음과 같다면
ITEM_ID | PARENT_ITEM_ID |
0 | NULL |
1 | 0 |
2 | 0 |
3 | 1 |
4 | 1 |
아이템의 희귀도가 'RARE'인 아이템은 'ITEM_A', 'ITEM_B', 'ITEM_D', 'ITEM_E' 입니다.
이 중 'ITEM_A' 는 'ITEM_B', 'ITEM_C' 로 업그레이드가 가능하며 'ITEM_B' 는 'ITEM_D' , 'ITEM_E' 로 업그레이드가 가능합니다. 'ITEM_D' 와 'ITEM_E'는 더 이상 업그레이드가 가능하지 않습니다. 따라서 결과는 다음과 같이 나와야 합니다.
ITEM_ID | ITEM_NAME | RARITY |
4 | ITEM_E | RARE |
3 | ITEM_D | RARE |
2 | ITEM_C | LEGEND |
1 | ITEM_B | RARE |
희귀도가 'RARE'인 아이템들의 모든 다음 업그레이드 아이템의 정보들을 출력하는 문제입니다.
예를 들어 레어 아이템인 A는 B로, B는 C로 업그레이드가 가능하다면 출력에는 B, C가 모두 포함되어 있어야 합니다.
따라서 부모 아이템이 RARE인 아이템들을 전부 출력하는 것이 문제 풀이의 핵심입니다.
정답 코드를 작성해보겠습니다.
WITH RARE AS (
SELECT ITEM_ID
FROM ITEM_INFO
WHERE RARITY = 'RARE'
)
우선 RARE 테이블을 생성해주었습니다. 이 테이블은 현재 등급이 RARE인 아이템들의 ID를 저장하는 역할입니다.
다음으로 II 테이블과 IT 테이블을 조인해주겠습니다.
SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO II
INNER JOIN
ITEM_TREE IT
USING(ITEM_ID)
WHERE PARENT_ITEM_ID IN (SELECT ITEM_ID
FROM RARE)
ORDER BY ITEM_ID DESC;
두 테이블을 조인하면 각 아이템의 부모 아이템이 누구인지 확인할 수 있습니다.
부모 아이템이 RARE 등급에 속하는 행들만 필터링해주면, 희귀도가 'RARE'인 아이템들의 모든 다음 업그레이드 아이템의 정보들을 구할 수 있습니다.
최종 코드는 다음과 같습니다.
WITH RARE AS (
SELECT ITEM_ID
FROM ITEM_INFO
WHERE RARITY = 'RARE'
)
SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO II
INNER JOIN
ITEM_TREE IT
USING(ITEM_ID)
WHERE PARENT_ITEM_ID IN (SELECT ITEM_ID
FROM RARE)
ORDER BY ITEM_ID DESC;
굳이 WITH 구문을 사용하지 않고, 바로 IN에 서브쿼리로도 사용할 수 있습니다.
SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO II
INNER JOIN
ITEM_TREE IT
USING(ITEM_ID)
WHERE PARENT_ITEM_ID IN (SELECT ITEM_ID
FROM ITEM_INFO
WHERE RARITY = 'RARE')
ORDER BY ITEM_ID DESC;
'SQL 고득점 Kit > SELECT' 카테고리의 다른 글
[SELECT] 조건에 맞는 개발자 찾기 (1) | 2024.09.30 |
---|---|
[SELECT] Python 개발자 찾기 (0) | 2024.09.29 |
[SELECT] 조건에 맞는 회원수 구하기 (0) | 2024.09.27 |
[SELECT] 상위 n개 레코드 (0) | 2024.09.26 |
[SELECT] 여러 기준으로 정렬하기 (0) | 2024.09.25 |