본문 바로가기
🗄️ DB_이야기/# ⚡SQL

🚀[SQL 알고리즘 문제 풀이] Programmers : 업그레이드 된 아이템 구하기(SELECT)

by gwon_s 2026. 4. 15.

👇 업그레이드 된 아이템 구하기

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

🔓 문제 설명

아이템의 희귀도가 'RARE'인 아이템들의 모든 다음 업그레이드 아이템의 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력하는 SQL 문을 작성해 주세요.

이때 결과는 아이템 ID를 기준으로 내림차순 정렬주세요.

 

예시 문제 데이터

[ITEM_INFO]

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

 

[ITEM_TREE]

ITEM_ID (자식) PARENT_ITEM_ID (부모)
1 0
2 0
3 1
4 1

 


⚡SQL Query

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 I.ITEM_ID DESC;

 

 

🔎 풀이 설명

1. 테이블 병합: ITEM_TREE와 ITEM_ID를 조인하여 부모-자식 간 관계를 한 테이블에 병합합니다.

2. 관계 찾기: 병합된 테이블에서 PARENT_ITEM_ID와 ITEM_INFO 테이블에서 희귀도가 'RARE'인 컬럼의 관계를 찾습니다.

  • 부모 0인 자식 :1, 2
  • 부모 1인 자식: 3, 4
  • 부모 3인 자식: X
  • 부모 4인 자식: X

2. 필터링: 먼저 희귀도 'RARE'인 ITEM_ID를 뽑아 PARENT_ITEM_ID와 비교하여 자식 데이터(업그레이드 아이템)를 추출합니다.


💡인사이트

1. Self Join 성능

  • 이 문제처럼 한 테이블 내에서 부모-자식 관계를 맺을 때는 조인 순서가 성능을 결정합니다. 'RARE' 아이템 수가 적다면, ITEM_INFO(RARE)를 먼저 읽고 ITEM_TREE를 거쳐 다시 ITEM_INFO로 가는 Nested Loop Join이 가장 효율적입니다.

2. 계층형 쿼리 (Oracle)

  • 만약 "모든 하위 업그레이드 아이템"을 다 찾아야 한다면 Oracle에서는 START WITH ... CONNECT BY 구문을 사용해야 하지만, 이 문제처럼바로 다음(1단계)업그레이드만 묻는다면 일반 JOIN이나 IN 서브쿼리가 훨씬 가볍고 빠릅니다.