본문 바로가기

SQL/LeetCode

LeetCode / 1204. Last Person to Fit in the Bus / MySQL(Medium)

728x90

📚문제

출처 : LeetCode(https://leetcode.com/problems/last-person-to-fit-in-the-bus/)


📝풀이

SELECT person_name
FROM Queue
WHERE turn = (SELECT MAX(turn) AS turn 
FROM (SELECT q1.turn
     , SUM(q2.weight) AS total_weight
FROM Queue q1 
INNER JOIN Queue q2 ON q1.turn >= q2.turn 
GROUP BY q1.turn
HAVING total_weight <= 1000
ORDER BY q1.turn) under_1000);

 

문제를 보니 SQL 첫걸음 교재 공부하면서 봤었던

SET 변수명 ; 을 이용하여

total_weight 변수를 설정하여 weight을 더해나가는 방법을 생각했는데

LeetCode에서는 계속 에러가 발생한다 🤔

(나머지 부분은 잘 되는데 변수명 선언 하는 부분이 추가되면 에러가 발생) 

 

그래서 Discussion의 타 MySQL 풀이를 참고하며

조금씩 단계별로 이해하면서 풀어보았다

 

참고링크 출처 : https://leetcode.com/problems/last-person-to-fit-in-the-bus/discuss/3883280/No-Window-oror-No-Limit-oror-Only-GROUP-BY

 

 

1. Self JOIN 

SELECT * 
FROM Queue q1 
INNER JOIN Queue q2 ON q1.turn >= q2.turn 
ORDER BY q1.turn;

왼쪽테이블(q1)의 turn으로 그룹화하면

오른쪽테이블은 q1의 turn에 대해

작거나 같은 turn들이 정렬 된다

 

2. SUM(q2.weight)

SELECT q1.turn
     , SUM(q2.weight) AS total_weight
FROM Queue q1 
INNER JOIN Queue q2 ON q1.turn >= q2.turn 
GROUP BY q1.turn 
ORDER BY q1.turn;

q1.turn으로 그룹화 된 상태에서

q2.weight의 SUM을 구하면

해당 Turn까지의 총 무게합이 나온다

(1명탔을땐 총 250kg , 2명탔을 땐 총 600kg, ...)

 

3. HAVING(total_weight) <=1000

SELECT q1.turn
     , SUM(q2.weight) AS total_weight
FROM Queue q1 
INNER JOIN Queue q2 ON q1.turn >= q2.turn 
GROUP BY q1.turn
HAVING total_weight <= 1000
ORDER BY q1.turn;

 

여러명이 탔을 때의 총 무게가 100kg이하여야 하므로

HAVING 조건으로 1000kg 까지의 행만 구하기

 

4. FROM절 서브쿼리 

SELECT MAX(turn) AS turn 
FROM (SELECT q1.turn
     , SUM(q2.weight) AS total_weight
FROM Queue q1 
INNER JOIN Queue q2 ON q1.turn >= q2.turn 
GROUP BY q1.turn
HAVING total_weight <= 1000
ORDER BY q1.turn) under_1000;

1000kg이하가 됐을 때의 Turn 수(몇번탔는지)를 알고 싶으므로 MAX(turn) 구하기

 

5. WHERE절 서브쿼리

SELECT person_name
FROM Queue
WHERE turn = (SELECT MAX(turn) AS turn 
FROM (SELECT q1.turn
     , SUM(q2.weight) AS total_weight
FROM Queue q1 
INNER JOIN Queue q2 ON q1.turn >= q2.turn 
GROUP BY q1.turn
HAVING total_weight <= 1000
ORDER BY q1.turn) under_1000);

 

1000kg가 됐을때의 turn수와 같은 turn수를 가질 때

누가 탔는지(person_name) 구하기

(SELECT MAX 값에서 스칼라 값을 가지므로 WHERE 조건 절에서 = 사용하기)

 

 

728x90