[프로그래머스/SQL] - Lv2 / 업그레이드 된 아이템 구하기

Chooooo·2024년 7월 7일
0

문제

문제 설명

어느 한 게임에서 사용되는 아이템들은 업그레이드가 가능합니다.

'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 nameTypeNullable
ITEM_IDINTEGERFALSE
ITEM_NAMEVARCHAR(N)FALSE
RARITYINTEGERFALSE
PRICEINTEGERFALSE

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

Column nameTypeNullable
ITEM_IDINTEGERFALSE
PARENT_ITEM_IDINTEGERTRUE

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

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


문제

아이템의 희귀도가 'RARE'인 아이템들의 모든 다음 업그레이드 아이템의 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력하는 SQL 문을 작성해 주세요. 이때 결과는 아이템 ID를 기준으로 내림차순 정렬주세요.


예시

예를 들어 ITEM_INFO 테이블이 다음과 같고

ITEM_IDITEM_NAMERARITYPRICE
0ITEM_ARARE10000
1ITEM_BRARE9000
2ITEM_CLEGEND11000
3ITEM_DRARE10000
4ITEM_ERARE12000

ITEM_TREE 테이블이 다음과 같다면

ITEM_IDPARENT_ITEM_ID
0NULL
10
20
31
41

아이템의 희귀도가 '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_IDITEM_NAMERARITY
4ITEM_ERARE
3ITEM_DRARE
2ITEM_CLEGEND
1ITEM_BRARE

내 코드

SELECT I.ITEM_ID, I.ITEM_NAME, I.RARITY
FROM ITEM_INFO I
JOIN ITEM_TREE T ON I.ITEM_ID = T.ITEM_ID
JOIN ITEM_INFO P ON T.PARENT_ITEM_ID = P.ITEM_ID
WHERE P.RARITY = 'RARE'
ORDER BY I.ITEM_ID DESC

코멘트

  1. 희귀도(RARITY)가 'RARE'인 아이템들의 모든 다음 업그레이드 아이템을 찾아야 한다.
  2. 찾은 업그레이드 아이템의 아이템ID, 아이템명, 아이템 희귀도 출력
  3. 아이템ID 기준 내림차순

해당 쿼리의 작동 방식.

  1. JOIN 사용
    • ITEM_INFO(I)와 ITEM_TREE(T)를 조인하여 모든 아이템과 그 부모 아이템의 관계 가져온다.
    • 다시 ITEM_INFO(P)와 조인하여 부모아이템의 정보 가져온다.
  2. 조건 필터링
    • where 절에서 부모 아이템(P)의 희귀도 'RARE'인 경우만 선택한다.
    • 이는 'RARE'희귀도를 가진 아이템의 모든 다음 업그레이드 아이템을 찾는 것과 같다.

ITEM_TREE 테이블을 통해 아이템 간의 관계를 파악하고, ITEM_INFO 테이블을 두 번 사용하여 부모 아이템과 자식 아이템의 정보를 모두 가져온다. 이렇게 함으로써 'RARE'희귀도를 가진 아이템의 모든 다음 업그레이드 아이템을 정확히 찾아낼 수 있다.

profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글