문제
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.
하리포터와 그의 친구들은 론과 함께 올리밴더의 가게에 있으며, 마침내 찰리의 오래된 부러진 지팡이를 교체하고 있습니다. 헤르미온느는 높은 파워와 오래된 나이를 가진 각 악하지 않은 지팡이를 구매하는 데 필요한 최소 골드 갈레온 수를 결정하는 것이 최선의 선택 방법이라고 결정합니다. 론이 관심을 보이는 지팡이의 id, age, coins_needed, 그리고 power를 출력하는 쿼리를 작성하세요. 결과는 power의 내림차순으로 정렬되어야 합니다. 만약 여러 지팡이가 동일한 파워를 가지고 있다면, age의 내림차순으로 결과를 정렬하세요.
입력 형식 다음 테이블은 올리밴더의 재고에 있는 지팡이에 대한 데이터를 포함하고 있습니다:
- Wands: id는 지팡이의 아이디이고, code는 지팡이의 코드이며, coins_needed는 지팡이를 구매하는 데 필요한 골드 갈레온의 총 개수를 나타내고, power는 지팡이의 품질(파워가 높을수록 지팡이가 더 좋음)을 나타냅니다.
Wands_Property: code는 지팡이의 코드이고, age는 지팡이의 나이이며, is_evil은 그 지팡이가 어둠의 마법에 적합한지 여부를 나타냅니다.
정답 코드
SELECT W.id, WP.age, W.coins_needed, W.power
FROM Wands W
JOIN Wands_Property WP ON W.code = WP.code
WHERE WP.is_evil = 0
AND W.coins_needed = (
SELECT MIN(coins_needed)
FROM Wands W2
JOIN Wands_Property WP2 ON W2.code = WP2.code
WHERE W.power = W2.power AND WP.age = WP2.age
)
ORDER BY W.power DESC, WP.age DESC;
문제는 각 파워와 나이 조합에서 최소 비용인 지팡이만 선택해야 한다. 그래서 서브 쿼리를 썼다. 처음에는 서브쿼리를 써야 한다는 생각을 못했는데 결국 써야 헀다. WITH을 쓰는 것도 괜찮아 보인다. 조건이 여러개 있으면 서브쿼리를 써보자.
WITH TEMP AS (
SELECT WP.age, W.power, MIN(W.coins_needed) AS min_coin
FROM Wands W
JOIN Wands_Property WP ON W.code = WP.code
WHERE WP.is_evil = 0
GROUP BY W.power, WP.age
)
SELECT W.id, WP.age, W.coins_needed, W.power
FROM Wands W
JOIN Wands_Property WP ON W.code = WP.code
JOIN TEMP T ON T.age = WP.age AND
T.power = W.power AND
W.coins_needed = T.min_coin
WHERE WP.is_evil = 0
ORDER BY W.power DESC, WP.age DESC;
WITH절을 이용한 쿼리. 다만 문제에서 MYSQL버전이 낮아서 실행은 안된다.
<2025녀 5월 2일 복습>
🧠 요약
- W2.power = W.power AND WP2.age = WP.age는
→ "같은 힘, 같은 나이의 지팡이 그룹 안에서"
→ "coins_needed가 최소인 지팡이"를 고르기 위한 조건입니다.
'MYSQL > HakerRank_Medium' 카테고리의 다른 글
Contest Leaderboard (0) | 2025.04.21 |
---|---|
Challenges 와 WITH 절 (0) | 2025.04.18 |
Top Competitors (0) | 2025.04.17 |
The Report : JOIN을 이렇게도 쓸 수 있구나! (0) | 2025.04.17 |
Weather Observation Station 20(중앙값 구하기) (0) | 2025.04.16 |