[프로그래머스] LV2. 업그레이드 된 아이템 구하기 (SQL)

2026. 5. 14. 16:21·SQL

 

 

 

문제 설명

어느 한 게임에서 사용되는 아이템들은 업그레이드가 가능합니다.
'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

 

 

 

 

문제 풀이

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

 

문제를 보자마자 이건 서브쿼리 문제다! 하고 떠오르긴 했지만, RARE에서 업그레이드인 애를 어떻게 찾을지 막막했다

서브쿼리 내용을 일단 먼저 작성한 뒤에 바깥 쿼리에서 어떻게 사용할 지를 생각하는 것이 쉬운 접근이었다.

서브쿼리를 토대로 결과 ITEM_ID가 0, 1, 3, 4가 나오게 된다.

 

WHERE T.PARENT_ITEM_ID IN (0, 1, 3, 4)라고 생각해보자.

Item_ID를 기준으로 부모는 아래처럼 매핑된다.

0 -> NULL

1 -> 0

3 -> 1

4 -> 1

 

문제를 풀면서 살짝 헷갈릴 수 있는데, 부모 -> 자식으로 가는 것이 업그레이드다. 

부모의 입장에서 자식으로 내려가는 아이디가 있으면 업그레이드 한다. 

 

ITEM_A의 경우는 B, C의 부모이다. (= B,C로 업그레이드 가능)

ITEM_B의 경우는 A의 자식이면서 D, E의 부모이다. (= D,E로 업그레이드 가능)

D, E의 경우에는 자식이 없으므로 더 이상 업그레이드가 불가능하다.

 

따라서 아래와 같이 출력된다.

ITEM_ID ITEM_NAME RARITY
4 ITEM_E RARE
3 ITEM_D RARE
2 ITEM_C LEGEND
1 ITEM_B RARE

 

 

 

 

'SQL' 카테고리의 다른 글

[프로그래머스] LV2. 연도 별 평균 미세먼지 농도 조회하기 (SQL)  (0) 2026.05.26
[프로그래머스] LV2. 물고기 종류 별 잡은 수 구하기 (SQL)  (0) 2026.05.14
[프로그래머스] LV2. 조건에 맞는 개발자 찾기 (SQL)  (0) 2026.05.13
[프로그래머스] LV2. 상품 별 오프라인 매출 구하기 (SQL)  (0) 2026.05.12
[프로그래머스] LV2. 분기별 분화된 대장균의 개체 수 구하기 (SQL)  (0) 2026.05.12
'SQL' 카테고리의 다른 글
  • [프로그래머스] LV2. 연도 별 평균 미세먼지 농도 조회하기 (SQL)
  • [프로그래머스] LV2. 물고기 종류 별 잡은 수 구하기 (SQL)
  • [프로그래머스] LV2. 조건에 맞는 개발자 찾기 (SQL)
  • [프로그래머스] LV2. 상품 별 오프라인 매출 구하기 (SQL)
아기꼬래
아기꼬래
  • 아기꼬래
    아꼬의 개발 일지
    아기꼬래
  • 전체
    오늘
    어제
    • 분류 전체보기 (53)
      • 프로젝트 및 공모전 (4)
        • Oracle 프로젝트 (3)
      • Algorithm Solving (26)
      • SQL (9)
      • Data Analysis (12)
      • AI (0)
      • FastAPI (0)
      • Spring Boot (0)
      • Oracle (1)
      • AWS (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    미래내일 일경험
    한국오라클
    Algorithm
    일경험
    시각화
    오라클 프로젝트
    데이터시각화
    coding test
    data analysis
    python
    프로그래머스
    태블로
    Oracle 일경험
    Oracle
    Tableau
    Oracle 프로젝트
    파이썬
    Algorithm Solving
    일경험 프로젝트
    SQL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
아기꼬래
[프로그래머스] LV2. 업그레이드 된 아이템 구하기 (SQL)
상단으로

티스토리툴바