스터디/학습일지

[SQL] 250618 코드카타 문제풀이 Leetcode 1204

다다킴 2025. 6. 18. 11:09

문제 : 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를 써야하고, 언제 서브쿼리를 사용해야하는지 헷갈리다... 일단 학습을 진행하고 구글링에 찾아보거나 문의를 해봐야겠다.