코딩테스트 준비/SQL

[프로그래머스] 업그레이드 된 아이템 구하기 Mysql

1dolcong 2024. 10. 14. 00:36

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

 

프로그래머스

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

programmers.co.kr

 

문제


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

 

예를 들어 'ITEM_A'->'ITEM_B'->'ITEM_C'와 같이 업그레이드가 가능한 아이템이 있다면
'ITEM_C'의 PARENT 아이템은 'ITEM_B'
'ITEM_B'의 PARENT 아이템은 'ITEM_A'
ROOT 아이템은 'ITEM_A'가 됩니다.

 

 

풀이1


  • 모든 다음 업그레이드 아이템
    • ITEM_TREE 테이블에서 PARENT_ITEM_ID가 업그레이드 이전, 현재 ITEM_ID가 업그레이드된 아이템이다.
      따라서, ITEM_TREE을 두개 JOIN 하여(C table, D table) C 테이블에서 ITEM_ID와 D 테이블에서 PARENT_ITEM_ID를 조인한다면 D 테이블의 ITEM_ID는 C 테이블의 ITEM_ID의 업그레이드된 아이템이다 
      SELECT 결과


  • 희귀도가 'RARE'
    • 희귀도는 ITEM_INFO에 있는 칼럼이기 때문에 ITEM_INFO도 조인을 해서 조건을 걸어줘야 함을 알 수 있다.
  •  아이템 ID를 기준으로 내림차순 정렬
    • ORDER BY ITEM_ID DESC 사용

 

 

해당 조건들을 파악한 후 쿼리문을 짜면 다음과 같다. 

SELECT A.ITEM_ID, A.ITEM_NAME, A.RARITY FROM ITEM_INFO A,
(SELECT D.ITEM_ID FROM ITEM_INFO B, ITEM_TREE C, ITEM_TREE D -- 업그레이드인 아이템 ID만 추출
WHERE B.ITEM_ID = C.ITEM_ID 
AND C.ITEM_ID = D.PARENT_ITEM_ID -- C의 ITEM_ID와 D의 PARENT_ITEM_ID 조인
AND B.RARITY ='RARE' -- 조건은 RARE
) E
WHERE A.ITEM_ID = E.ITEM_ID
ORDER BY A.ITEM_ID DESC -- 정렬조건은 ITEM_ID 내림차순

 

 


 

 

풀이2


위와 조건은 동일하게 풀었지만, 조인이 아니라 서브쿼리를 활용하여 작성할 수도 있다.

  1.  RARE에 해당하는 ITEM_ID를 ITEM_INFO 테이블에서 추출한다.
  2. 추출된 데이터를 ITEM_TREE에서 PARENT_ITEM_ID에 있는지 확인하고
    그것의 ITEM_ID를 추출한다. (=업그레이드 ID 목록)
SELECT ITEM_ID, ITEM_NAME, RARITY FROM ITEM_INFO 
 WHERE ITEM_ID IN
 (SELECT ITEM_ID FROM ITEM_TREE WHERE PARENT_ITEM_ID IN  -- 2) 
  (SELECT ITEM_ID FROM ITEM_INFO WHERE RARITY = 'RARE') -- 1) 
 ) 
  ORDER BY ITEM_ID DESC