본문 바로가기

SQL

HackerRank Ollivander's Inventory

문제 이해

론은 새로운 지팡이를 사려고 한다. 같은 power와 age라면, 그 중 가장 저렴한 지팡이를 고르는 것이 좋은 선택이다. 아래의 두 테이블 Wands와 Wands_Property를 사용해서 그러한 지팡이들의 id, age, coins_needed, power를 가져와야 한다. 이 때, power의 내림차순으로 정렬하고, power가 같은 경우에는 age의 내림차순으로 정렬한다. 

 

Wands

id : 지팡이의 id

code : 지팡이의 코드

coins_needed : 지팡이를 사는 데 필요한 골드 갤런

power : 지팡이의 퀄리티. power가 높을수록 더 좋은 지팡이.

 

 

Wands_Property

code : 지팡이의 코드

age : 지팡이의 age

is_evil : 지팡이가 어둠의 마법에 좋은지 여부. 0이면 not evil이다. 

 

풀이 설명

1. Wands와 Wands_Property 테이블을 code를 기준으로 join한다.

2. is_evil이 0인 것들만 남긴다.

3. age와 power가 같은 것들 중 가장 저렴한 것만 남긴다.

4. power 내림차순, age 내림차순으로 정렬한다.

 

age와 power가 같은 것들 중 가장 저렴한 것만 남기기 위해서는 서브 쿼리를 사용한다. 서브 쿼리에서 어떠한 row와 power, age가 같은 것들 중 최저가를 찾아내고, row의 가격과 찾은 최저가가 같은 경우만 남기면 된다.

 

구현

SELECT w.id, wp.age, w.coins_needed, w.power
FROM wands w
INNER JOIN wands_property wp
ON w.code = wp.code
WHERE wp.is_evil = 0 
AND w.coins_needed = (SELECT MIN(coins_needed)
                    FROM wands x
                    INNER JOIN wands_property y
                    ON x.code = y.code
                    WHERE x.power = w.power 
                    AND y.age = wp.age)
ORDER BY w.power DESC, wp.age DESC;

 

오류가 있었던 부분

문제 이해를 제대로 못해서 같은 스펙이면 가장 저렴한 것만 남겨야 한다는 것을 몰랐다.

가장 저렴한 것을 남길 때는 메인 쿼리에서 w.coins_needed = (select min(coins_needed) ... (서브쿼리에서 찾은 최저가)로 골라내면 된다는 것을 생각하지 못했다.

 

문제 링크: www.hackerrank.com/challenges/harry-potter-and-wands/problem

'SQL' 카테고리의 다른 글

HackerRank Challenges  (0) 2021.03.12