반응형
mysql을 사용합니다. hard 난이도 문제는 생각보다 쉽게 풀려서 따로 풀이하지 않았습니다.
# 626 Exchange Seats
쿼리의 길이는 짧지만, 체감 난이도가 높은 편이었습니다.
Q. 연속된 id를 가진 학생의 자리를 바꾸어라. 학생의 수가 홀수일 경우, 마지막 id의 학생은 자리를 바꾸지 않는다.
풀이
- key : case when, subquery
- case when
- id가 홀수이면서 마지막에 위치한 경우, id를 그대로 출력한다
- id가 짝수인 경우 id에서 1을 뺀다
- id가 홀수이지만 마지막에 위치하지 않은 경우 id에서 1을 더한다
- subquery : 마지막에 위치한 id를 확인하기 위해 학생의 수를 센다
- 정렬 : 새로 계산한 id 순으로 정렬한다
- 시간 : 905 ms
- 메모리 : 0b
select case when mod(id, 2) = 1 and id = (select count(*) from Seat) then id
when mod(id, 2) = 0 then id - 1
else id + 1
end as id,
student
from Seat
order by id
# 1321 Restaurant Growth
풀어보려다가 너무 어려워서 결국 솔루션을 필사했습니다..
Q. 소수점 2번째 자리까지 나타내어 일주일 간의 평균 amount를 구하여라. 날짜순으로 정렬하여라.
풀이
- key : subquery, window function
- subquery : 날짜별로 7일 간의 amount 합계를 구한다
- window function
- sum() over : 날짜별로 현재 날짜로부터 6일 이전, 즉 일주일 간의 합계를 계산합니다.
- min() over
- window function
- 시간 : 665ms
- 메모리 : 0b
select visited_on, amount, round(amount/7, 2) average_amount
from (select distinct visited_on, sum(amount) over (order by visited_on range between interval 6 day preceding and current row) amount,
min(visited_on) over() 1st_date from Customer) t
where visited_on >= 1st_date + 6
# 585 Investments in 2016
Q. tiv_2015가 다른 사람과 같지만, 다른 사람과 지역이 다른 경우의 tiv_2016 합계를 구하여라.
풀이
- key : subquery, group by
- subquery
- tiv_2015를 기준으로 count가 2개 이상인 경우 저장
- lat, lon을 기준으로 count가 1개인 경우만 저장
- where 절에서 조건에 맞는 경우 필터링
- 시간 : 836 ms
- 메모리 : 0b
select round(sum(tiv_2016), 2) as tiv_2016
from Insurance
where tiv_2015 in (select tiv_2015 from Insurance group by tiv_2015 having count(*) >= 2)
and (lat, lon) in (select lat, lon from Insurance group by lat, lon having count(*) = 1)