What a Beautiful Data!

[HackerRank] Ollivander's Inventory 문제 풀이 mysql

by darami

[HackerRank] Ollivander's Inventory

 

 

갑..자기 분위기 해리포터? 우왕 ✨

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

                                                            ollivander? 아 여기! 

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.


해리포터와 그의 친구들은 올리반도르에 갔어요 론과 함께, 마침내 찰리의 부러진 지팡이를 바꾸기 위해서.
헤르미온느는 가장 좋은 방법은 악하지 않은 강한 힘과 나이를 가진 지팡이를 사기 위해 필요한 최소한의 금 갤런을 정하는 것이라고 결정했어요. 그 id, 나이,필요한 코인, 그리고 론이 흥미가 있는 힘인지를 출력하는 쿼리문을 power의 내림차순으로 정렬해주세요. 만약 지팡이 하나 이상이 같은 힘을 가졌다면, 나이 내림차순으로 정렬해주세요. 

 

 

그런데..

one to one mapping 이 처음에 무슨 말인지 헷갈렸다. 

한국말로 그대로 1:1 대응! ㅋㅋㅋ (억울해 이럴때 마다ㅠㅠ 수학 영어로 배워써야 했어..)


왜 이렇게하면 안될까? 

SELECT w.id,p.age,w.power,MIN(w.coins_needed)
FROM Wands AS w
JOIN Wands_Property AS p ON w.code=p.code
WHERE p.is_evil=0
GROUP BY w.id,p.age,w.power
ORDER BY w.power,p.age DESC​

--> 이렇게 하면 w.id 값이 고유하기 때문에 각자 각 하나의 값의 최솟값을 구하게 된다. = 자기자신 

그렇기 때문에 서브쿼리를 통해서 최솟값을 구해줘야하는 거다! 

 

이 풀이에는 다양한 방법이 있는데

1. Where절 서브쿼리 방법

2. From절 서브쿼리 방법이 있다.

 

하지만 기본 논리는 같음으로 Where절 서브쿼리 방식으로 풀어보겠다.  

 

조건 

-- power와 age가 같을 때 최소의 코인을 지불한다.

 

-> 그러면 power와 age를 GROUP BY 해주고 거기에 맞는 최솟값을 출력해줘야한다.

    그런데 우리가 고유한 값 id를 출력해줘야하니까 셀프조인을 통해 서브쿼리를 만들어야하는 것  

-- evil=0이어야 한다
-- desc power, desc age

 

내 풀이

SELECT w.id,wp.age, w.coins_needed,w.power
FROM Wands w
JOIN Wands_Property wp ON w.code=wp.code
WHERE w.coins_needed= (SELECT MIN(coins_needed) FROM Wands w2
JOIN Wands_Property wp2 ON wp2.code=w2.code
WHERE wp2.is_evil=0 AND wp2.age=wp.age
AND w.power=w2.power)
ORDER BY power DESC, age DESC

ㅎㅇ 님 풀이

select id
,age
,coins_needed
,power
from wands w1
join wands_property p1 on w1.code = p1.code
where w1.coins_needed = (select MIN(coins_needed)
from wands w2
join wands_property p2 on w2.code = p2.code
where is_evil = 0
and p2.age = p1.age and w1.power = w2.power)
order by w1.power desc, p1.age desc

여기서 p2.age = p1.age and w1.power = w2.power 이렇게 해줘야한다는게 중요하다! 

age와 power가 같은 것 중에 최소값을 구하는 거니까! 

 

그러기 위해서 셀프 조인을 해준다. 

블로그의 프로필 사진

블로그의 정보

다람

darami

활동하기