-
Programmers - 업그레이드 된 아이템 구하기MySQL_Programmers/Level2 2025. 4. 11. 11:53반응형
문제 설명
어느 한 게임에서 사용되는 아이템들은 업그레이드가 가능합니다.
'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') AND T.PARENT_ITEM_ID IS NOT NULL ORDER BY I.ITEM_ID DESC;
코드실행 결과는 맞지만 정답처리가 되지 않음
SELECT A.ITEM_ID, A.ITEM_NAME, A.RARITY FROM ITEM_INFO A WHERE A.ITEM_ID IN (SELECT ITEM_ID FROM ITEM_TREE WHERE PARENT_ITEM_ID IS NOT NULL) ORDER BY A.ITEM_ID DESC
- 이 쿼리는 희귀도가 'RARE'인 부모 아이템이 아닌, 모든 업그레이드 가능한 자식 아이템을 가져옵니다.
- 문제에서 요구한 것은 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 IS NOT NULL ORDER BY I.ITEM_ID DESC;
- 희귀도가 'RARE'인 부모 아이템이 아닌, 모든 부모 아이템을 기준으로 자식 아이템을 찾고 있습니다.
- 문제에서 요구하는 것은 'RARE' 희귀도를 가진 부모 아이템에 대한 업그레이드 아이템들을 찾는 것이기 때문에, RARE에 대한 필터링이 빠져 있습니다.
첫번째 두번째경우 모두 RARE 희귀도를 가진 부모 아이템에 대한 업그레이드 여부들을 체크하지않았기 때문에 틀렸다.
사실상 문제를 읽고 이해하는 과정이 제일 복잡하였다. 최종적으로 아래의 부분이 제일 중요한 포인트였다.
WHERE T.PARENT_ITEM_ID IN (SELECT ITEM_ID FROM ITEM_INFO WHERE RARITY = 'RARE')
- T.PARENT_ITEM_ID는 각 자식 아이템의 부모 아이템 ID를 나타냅니다.
- **IN**을 사용하여 T.PARENT_ITEM_ID가 ITEM_INFO 테이블에서 희귀도가 'RARE'인 아이템들의 ITEM_ID 목록에 존재하는지를 확인합니다.
- 즉, PARENT_ITEM_ID가 'RARE' 희귀도 아이템의 ID 목록에 포함된 자식 아이템만 선택합니다. RARE 희귀도 아이템들이 부모 아이템인 경우에만 해당 자식 아이템이 선택됩니다.
반응형'MySQL_Programmers > Level2' 카테고리의 다른 글
Programmers - 조건에 부합하는 중고거래 상태 조회하기 (0) 2025.04.15 Programmers - ROOT 아이템 구하기 (0) 2025.04.14 Programmers - 조건에 맞는 개발자 찾기 (0) 2025.04.10 Programmers - 조건에 맞는 사원 정보 조회하기 (0) 2025.04.09 Programmers - 연도 별 평균 미세먼지 농도 조회하기 (0) 2025.04.08