코딩테스트/SQL

[프로그래머스][MySQL] Lv. 3 업그레이드 할 수 없는 아이템 구하기

_알파카 2024. 7. 16. 01:02
728x90

문제 설명

https://school.programmers.co.kr/learn/courses/30/lessons/273712

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

주어진 문제의 조건을 정리하면 다음과 같다. 

- 더 이상 업그레이드할 수 없는 아이템 조회
- 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력
- 아이템 ID를 기준으로 내림차순

 

처음에는 문제 자체가 좀 어려웠지만, 천천히 해석을 해보자. 

 

ITEM_TREE 테이블은 각 아이템 간의 업그레이드 정보를 담고 있다. 

즉, 주어진 테이블을 차례대로 정리하면..

PARENT_ITEM_ID에서 업그레이드 한 것이 ITEM_ID이 되는 것이다. 

ITEM_ID <- PARENT_ITEM_ID

 

ITEM_A <- X(부모 아이템 없음)
ITEM_B <-  ITEM_A  (A에서 B로 업그레이드 가능)
ITEM_C <-  ITEM_A  (A에서 C로 업그레이드 가능)
ITEM_D <-  ITEM_B  (B에서 D로 업그레이드 가능)
ITEM_E <-  ITEM_B  (B에서 E로 업그레이드 가능)

 

즉, ITEM_A와 ITEM_B는 무언가로 업그레이드가 가능하며, 다른 아이템들은 업그레이드가 불가하다. 

정리하자면, 'PARENT_ITEM_ID'에 없는 ITEM_ID를 구하면 되는 것이다!

 

 

내 풀이

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 i.ITEM_ID NOT IN (
            SELECT PARENT_ITEM_ID
            FROM ITEM_TREE
            WHERE PARENT_ITEM_ID IS NOT NULL
)
ORDER BY i.ITEM_ID DESC;

 

주의할 점

: IN 연산자 사용시 비교 구문에 NULL이 들어가면 안되므로, PARENT_ITEM_ID가 NULL이 아닌 것으로 한정해줘야 한다. 

 

이를 기반으로, PARENT_ITEM_ID에 존재하지 않는 ITEM_ID를 뽑아내면 된다. 

 

끄읏-!

728x90