하파와 데이터

[해커랭크] Ollivander's Inventory_SUBQUERY를 통한 풀이 본문

Development/문제풀이

[해커랭크] Ollivander's Inventory_SUBQUERY를 통한 풀이

hhpp 2023. 8. 2. 12:34
더보기

[문제]

Harry Potter and his friends are at Ollivander's with Ron, finally replacing Charlie's old broken wand.

Hermione decides the best way to choose is by determining the minimum number of gold galleons needed to buy each non-evil wand of high power and age. Write a query to print the id, age, coins_needed, and power of the wands that Ron's interested in, sorted in order of descending power. If more than one wand has same power, sort the result in order of descending age.

제시된 테이블1

제시된 테이블 2

 

대략적인 문제를 설명하면, 

해리포터와 친구들은 Ollivander상점에서 지팡이를 구매하려고 한다. 

헤르미온느가 지팡이를 구매할때 기준을 세우려는데, 그 기준이 여러개이다. 

1. Non-evil 지팡이일것.

2. age별- power별로 구분해서 볼 것

3. 동일 age and 동일 power 지팡이 중에서는 coins_needed가 가장 적은 값일 것! 

4. power별로 내림차순, 동일 power 내에서는 age별로 내림차순으로 데이터를 보여줄 것!

 

이를 기준으로 전체 Ollivander 상점의 지팡이를 다 보려는 속셈이다... 귀찮게 구는군

 

우선 이를 위해선, 지팡이와 지팡이 스펙을 담고 있는 테이블을 조인한다.

두 테이블은 동일한 code를 공유하고 있으니, 각 테이블에서 code를 기준으로 조인!

SELECT *
FROM Wands W
INNER JOIN Wands_Property P on W.code = P.code

이후, 헤르미온느의 조건대로 하나씩 풀어나가면 문제는 해결 될 것 같다. 

SELECT W.id, P.age, MIN(W.coins_needed), W.power
FROM Wands W
INNER JOIN Wands_Property P on W.code = P.code
WHERE P.is_evil = 0 -- non evil 지팡이 데이터 추출
GROUP BY P.age, W.power, W.id -- 데이터를 AGE, POWER 기준으로 그룹핑
ORDER BY W.power DESC, P.age DESC -- 제시된 정렬기준

상기처럼, AGE와 POWER별로 그룹핑을 하고, SELECT 에서 추출값으로 COINS_NEEDED에 최소값을 적으면 되겠지?라는 생각을 했지만, 이건 그냥 내 머리속에서만 돌아가는 코딩이었다... 

이렇게 코딩을 하니, 최소값을 뽑아내지 못하였고 동일 AGE 동일 POWER 내에 있는 모든 데이터가 다 추출되었다. 

 

이에, 조건문을 변경해서, 각 에이지와 파워별로 COINS_NEEDED의 최소값만을 가진 쿼리문을 서브쿼리(C)로 만들어서 

WHERE 조건에서W.COINS_NEEDED 값과 C쿼리에 있는 COINS_NEEDED가 동일하면

가장 낮은 금액이 나올 수 있을 것이라고 생각했다. 

SELECT W.id, P.age, W.coins_needed, W.power
FROM Wands W
INNER JOIN Wands_Property P on W.code = P.code
WHERE P.is_evil = 0 -- non evil 지팡이 데이터 추출
AND W.coins_needed = 
(
	SELECT MIN(*)
    FROM Wands W2
    INNER JOIN Wands_Property P2 on W2.code = P2.code
    WHERE P.age = P2.age
    and W.power = W2.power
 ) -- age/power별 coins_needed의 최소값 추출
 ORDER BY W.power DESC, P.age DESC