본문 바로가기
TIL - 프로그래밍/SQL

[해커랭크] Ollivander's Inventory - MySQL

by chaemj97 2023. 7. 14.
728x90

https://www.hackerrank.com/challenges/harry-potter-and-wands/problem?isFullScreen=true 

 

Ollivander's Inventory | HackerRank

Help pick out Ron's new wand.

www.hackerrank.com


  • 문제
    • non-evil이고 power와 age가 같다면 coins_needed는 최소여야 한다.
    • id, age, coins_needed, power를 출력하라
    • power 내림차순, age 내림차순 정렬

  • 풀이 1
    • 우선 power와 age가 같을 때 coins_needed를 가질려면 그룹화를 사용해야 한다.
      • 서브 쿼리를 통해 각각의 경우 가장 작은 coins_needed를 구할 수 있다.
  • 코드 1
SELECT W.id, P.age, W.coins_needed, W.power
FROM (SELECT *
      FROM Wands
      -- 각각의 경우 가장 적은 coins_needed
      WHERE (code,power,coins_needed) IN (SELECT code, power, MIN(coins_needed)
                                          FROM Wands
                                          GROUP BY code, power)) AS W
INNER JOIN (SELECT code, age
            FROM Wands_Property
            WHERE is_evil = 0) AS P
ON W.code = P.code
ORDER BY W.power DESC, P.age DESC;

 

  • 풀이 2 - 윈도우 함수
    • 윈도우 함수를 사용하여 age, power가 같은 경우 coins_needed의 순위를 매겨보기
      • 윈도우 함수의 결과를 조건문에 사용할 수 없으므로  서브쿼리로 묶어서 순위가 1인 것 뽑기
SELECT W.id
     , WP.age
     , W.power
     , W.coins_needed
     , ROW_NUMBER() OVER (PARTITION BY WP.age, W.power ORDER BY coins_needed) rn
FROM Wands W
    INNER JOIN Wands_Property WP
        ON W.code = WP.code
WHERE is_evil = 0;

  • 코드 2
SELECT id, age, coins_needed,power
FROM (
    SELECT W.id
         , WP.age
         , W.power
         , W.coins_needed
         , ROW_NUMBER() OVER (PARTITION BY WP.age, W.power ORDER BY coins_needed) rn
    FROM Wands W
        INNER JOIN Wands_Property WP
            ON W.code = WP.code
    WHERE is_evil = 0
) t
WHERE t.rn = 1
ORDER BY power DESC, age DESC;
728x90
반응형

댓글