해커랭크 세번째 문제풀이 포스팅이네요. 오늘도 medium 난이도 5문제 풀어볼 예정이고, 더보기를 클릭하시면 각 문제의 풀이를 보실 수 있습니다. MySQL 기준입니다.
- Weather Observation Station 19
유클리디안 거리를 구하는 문제입니다. 유클리디안 거리 공식은 다음과 같습니다.
$$ distance = \sqrt{(q_1 - p_1)^2 + (q_2 - p_2)^2} $$
경도 및 위도가 최대/최소인 곳의 좌표를 이용해야하므로 min, max를 사용해 최대/최소값을 구합니다.
pow는 제곱을 계산하기 위함 함수입니다.
이후 sqrt를 통해 제곱근을 구하시고 문제에서 제시한대로 반올림해주시면 됩니다.
select round(sqrt(pow(min(s.lat_n) - max(s_new.lat_n), 2) + pow(min(s.long_w) - max(s_new.long_w), 2)),4)
from station s, station s_new
- Weather Observation Station 20
중앙값을 구하는 문제입니다. mysql에는 median 함수가 없기 때문에 체감상 난이도가 꽤 있는 문제입니다. 오라클로 푸시면 훨씬 쉽고요,,, 오라클로도 문제를 한 번 풀어봐야할 것 같습니다.
median 함수가 없기 때문에 백분율을 계산해서 구해야 합니다.
latitude 순으로 정렬한 뒤, percent_rank()로 백분율 순위을 구합니다.
select round(lat_n, 4)
from (select lat_n, percent_rank() over (order by lat_n) percent from station) a
where percent = 0.5
- The Report
학생 점수에 따라서 등급을 계산하고, 학생 이름, 등급, 점수를 함께 출력하는 문제입니다. 단, 8등급 이상인 학생만 이름을 출력합니다.
select 절에 조건을 주어 8등급 이상인 경우만 이름을 출력합니다.
학생 테이블과 등급 테이블 join 시, 학생 점수 marks가 min - max 사이에 있는 경우만 조인합니다.
select if(grade > 7, name, null), grade, marks
from students join grades
on marks between min_mark and max_mark
order by grade desc, name asc
- Top Competitors
하나 이상의 full score를 달성한 해커의 id와 이름을 출력하는 문제입니다.두 명 이상의 해커가 동일한 횟수의 full score를 달성했다면, id에 따라 정렬합니다.
조인할 테이블이 조금 많습니다.
submission - hacker는 해커 id별로, challenge와는 챌린지 id별로, difficulty와는 difficulty level별로 조인하시면 됩니다.
select h.hacker_id, h.name
from submissions s inner join hackers h on s.hacker_id = h.hacker_id
inner join challenges c on s.challenge_id = c.challenge_id
inner join difficulty d on d.difficulty_level = c.difficulty_level
where d.score = s.score #full score 여부 확인
group by h.hacker_id, h.name
having count(c.challenge_id) >= 2 #full score 달성 횟수가 2회 이상인 경우만
order by count(c.challenge_id) desc, h.hacker_id asc
- Olivander's inventory
가격이 가장 저렴하면서 & non-evil 한 지팡이를 찾는 문제입니다.
지팡이 테이블과 지팡이 속성 테이블을 조인합니다(code 기준)
동일한 위력을 가졌을 때, 가장 저렴한 지팡이를 찾기 위해 서브쿼리를 사용합니다.
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(coins_needed) from wands ws where ws.code \n
= w.code and ws.power = w.power)
order by w.power desc, p.age desc
'Data > SQL' 카테고리의 다른 글
[리트코드] SQL 50 - Basic Aggregate Functions 문제 풀이(# 1251, # 1174, # 550) (0) | 2023.10.09 |
---|---|
[리트코드] SQL 50 - Basic Join 문제 풀이(# 1280, # 570, # 1934) (0) | 2023.10.01 |
해커랭크 SQL 문제 풀이 - Medium ③ (0) | 2023.05.22 |
해커랭크 SQL 문제풀이 - Medium ① (1) | 2023.05.15 |
해커랭크 SQL 문제풀이 - Easy (0) | 2023.05.14 |