문제 : Last Person to Fit in the Bus (풀이 소요 시간 45분)
https://leetcode.com/problems/last-person-to-fit-in-the-bus/description/
무게 제한을 초과하지 않고 버스에 탈 수 있는 마지막 사람의 이름을 찾기 위한 솔루션을 작성합니다. 첫 번째 사람이 무게 제한을 초과하지 않도록 테스트 케이스가 생성됩니다. 버스는 한 번에 한 사람만 탑승할 수 있습니다.
with ordered as (
select * , sum(weight) over (order by turn) as total_weight from Queue
)
select person_name
from ordered
- 서브쿼리를 써야하나... with를 써야할까 고민을 했다. 탑승 순서(turn) 대로 무게의 합 sum(weight) 을 구해야 하기 때문에 with 함수를 찾아가며 작성을 해보고 서브쿼리도 한번 시도해봄
- 무게의 합은 sum(weight) , 탑승 순서 별 인원도 포함해야하기 때문에 over()를 이용하였다.
- 탑승순서대로 무게를 더하기 위해 order by는 turn 기준으로 하였다
where total_weight <= 1000
order by total_weight desc
limit 1 ;
- 추가로 weight에서 누적합이 1000이상 넘어가지 말아야 하므로 누적합보다 작은행을 불러주었고,
누적 몸무게를 내림차순 하여, Limit를 걸어주었다.
[문제 정답]
with ordered as (
select * , sum(weight) over (order by turn) as total_weight from Queue)
select person_name
from ordered
where total_weight <= 1000
order by total_weight desc
limit 1 ;
[원래 서브쿼리로 시도했던 내용]
SELECT person_name FROM (
SELECT person_name, turn,
SUM(weight) OVER (ORDER BY turn) AS total_weight
FROM Queue
) AS A
WHERE total_weight <= 1000
ORDER BY turn DESC
LIMIT 1;
서브쿼리 경우도 with 함수 사용할 때 기준과 얼추 비슷하지만 막상 작성을 하려니 귀찮았다. (머리가 더 아파오는기분...)
언제 with를 써야하고, 언제 서브쿼리를 사용해야하는지 헷갈리다... 일단 학습을 진행하고 구글링에 찾아보거나 문의를 해봐야겠다.
'스터디 > 학습일지' 카테고리의 다른 글
| [SQL] 코드카타 풀이 Employees Whose Manager Left the Company (0) | 2025.06.20 |
|---|---|
| [SQL] 20250619- mySQL 문제 풀이 미션 (1) (0) | 2025.06.19 |
| [SQL] 20250617- mySQL 문제 풀이 미션 (1) (0) | 2025.06.18 |
| [SQL] 20250616- mySQL 문제 풀이 미션 (2) (1) | 2025.06.16 |
| [SQL] 20250616- mySQL 문제 풀이 미션 (1) (3) | 2025.06.16 |