본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] Hacker Rank - Ollivander's Inventory

by kime2 2024. 6. 12.
출처
 

Ollivander's Inventory | HackerRank

Help pick out Ron's new wand.

www.hackerrank.com

 

 

문제

 the minimum number of gold galleons needed to buy each non-evil wand of high power and age.

 

문제에 대한 해석

조건1. non_evil wand (값이 0인것)

조건2. age와 power가 각각 같은 것들중에 coin_needed가 가장 작은 것

?  code, age 간의 매핑은 1:1 관계

풀이(MYSQL)

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(w2.coins_needed)
    from Wands w2 join Wands_Property wp2
on w2.code = wp2.code
    where wp2.is_evil = 0
      and wp2.age =  wp.age
     and w.power = w2.power)
order by w.power desc, age desc

 

작동순서

💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환

 

  1. FROM 절: Wands와  Wands_Property를 조인하여
  2. WHERE 절: is_evil 이 0으로 악한 힘이 없는 조건과 하단 서브쿼리의 결과와 coins_needed가 같은 경우 필터링 하여 
    1. Wands와  Wands_Property를 새롭게 조인한 테이블에서
    2. is_evil 이 0으로 악한 힘이 없는 조건으로 필터링 한 후 
    3. 새롭게 조인한 테이블에서 age와 기존 테이블의 age가 같고
    4. 새롭게 조인한 테이블에서 power와 기존 테이블의 power가 같은 경우 
    5. coins_needed의 최솟값을 조회하라
  3.  
  4. SELECT 절: id, age, coins_needed, power을 조회하라
  5. ORDER BY 절: power 내림차순,  age 내림차순
정답 age = 496, power = 10인 경우의 coin


age = 496, power = 10인 경우의 coin은 2개 존재 
> 이중 가장 작은 것을 조회 하는 조건

 

다른사람 풀이

wp.is_evil = 0조건을 메인쿼리 / 서브쿼리 / 메인+ 서비 쿼리에 주어도 모두 정답

배운점

wp.is_evil = 0조건을 어디에 추가해야 하는가?

 

1. 서브쿼이에만 조건이 있을 경우 
: 정답, age와power가 같고 evil=0이최소화 하는 coin을 선행으로 찾은뒤
메인쿼리에서 해당 coin과 같은 지팡이 조회

2. 메인 쿼리에만 있을 경우

age와power가 같은 경우 최소화 하는 coin조회
> 이떄 coin 의 최솟값이 is_evil = 1일경우 (예 : age = 1, coin=1, power=1 evil =1 과  age = 1, coin=2, power=1 evil =0 일경우 메인쿼리에서는 age = 1, coin=1, power=1 evil =1 만 출력)
> 이후  evil=0 이라는 조건을 주면 age = 1, power=1 인 지팡이는 조회되지 않음
> 그러나 서브쿼리에 evil=0 조건이 있는 경우는 age = 1, coin=2, power=1 로 age = 1, power=1 인 지팡이가 조회됨

즉, 서브쿼리에 있을때와 메인쿼리에만 있을때 결과값이 다름

그러나 문제에서는 동일 age = 1, power=1가 없어도 되는 것

왜? age와power가 같은 경우 최소화 하는 coin이 evil이 1인 경우의  age와power는  evil이 0인 경우가 없다

age와power가 같은 경우 최소화 하는 coin이 evil이 1인 경우 옆의 age,pwer가 같은 경우 evil이 0인 경우
select wp.age,w.coins_needed, w.power, wp.is_evil
from Wands w join Wands_Property wp
on w.code = wp.code
where wp.age in (156, 153, 150, 146, 135, 130, 127,123,116,113,107)
and w.power = 9
and wp.is_evil = 0
order by age desc





없음!



 with tmp  as (
     select wp.age, w.power
from Wands w join Wands_Property wp
on w.code = wp.code
where w.coins_needed
   = (select min(w2.coins_needed)
    from Wands w2 join Wands_Property wp2
on w2.code = wp2.code
    where wp2.age =  wp.age
     and w.power = w2.power)
and wp.is_evil = 1
order by w.power desc, age desc) -- age, power의 값이 각각 같다면 coins_needed 값을 최소로 하는 지팡이 중 evil=1인 경우

select wp.age, w.power, wp.is_evil
from Wands w join Wands_Property wp
on w.code = wp.code
join tmp t
on wp.age = t.age and w.power = t.power