예제
- leet code # 626
- leet code # 1204
Leet Code #626. Exchange Seats
[ 문제상황 ]
id - 학생이름이 나열되어 있는 테이블에서
- (1,2) / (3,4) / ... 이웃된 학생끼리 id를 swap
- 만약 학생 수가 홀수 명이라서 한 명이 남으면 그 학생은 id 유지
[ 해결방법 ]
Sol 1 :
CASE WHEN 으로 케이스 분류
접근법 :
1. id가 짝수면 (2로 나눈 나머지가 0) 기존 id에서 1을 빼고,
2. id가 홀수면 (2로 나눈 나머지가 1) 기존 id에서 1을 더함.
3. 그런데 전체 학생 수가 홀수일 때 마지막 홀수 번호 학생은 1을 더해주면 안되니까 subquery 이용해서 case 나눠주기.
id = (SELECT COUNT(*) FROM Seat) : id = (전체 학생 수)인 경우
Sol 2 :
WINDOW FUNCTION 이용하기
접근법 :
1. id가 짝수면 LAG 로 현재 행보다 앞에 있는 값 (student의 이름) 을 추출
2. id가 홀수면 LEAD 로 현재 행보다 뒤에 있는 값 (student의 이름) 을 추출
3. 그런데 마지막 학생의 id가 홀수 일때, "뒤에 있는 값"이 존재하지 않으므로, (즉 NULL이 됨)
COALESCE 함수로 NULL을 "student" (현재 자기 이름)으로 대체 !
참고 1 :
postgresql 은 COALESCE( param1, param2 )
mysql 은 IFNULL(param1, param2)
- 만약 param1이 null이면 param2로 대체됨
참고 2 :
mysql에서
COALESCE(val1, val2, val3, ... , valn) 는
처음으로 null이 아닌 값을 돌려준다.
그러니까 사실 참고 1에서 null이 예상되는 값을 앞에 넣는다면 mysql에서도 COALESCE 가능!
Leet Code #1204. Last Person to Fit in the Bus
[ 문제상황 ]
승객별 id, 이름, 몸무게, 그리고 탑승순서 (turn)이 있는 표.
버스의 최대 허용 무게가 1000kg일 때 가장 마지막으로 탑승할 수 있는 사람의 이름을 return 하는 문제 !
[ 해결방법 ]
Sol :
window function + subquery
Code :
접근법 :
1. 일단 서브쿼리로, 자기 탑승순서까지 승객들이 탑승했을 때의 총 무게를 새로운 컬럼으로 만들어주기
- over (order by turn asc) : 'turn'이라는 컬럼 오름차순으로 나열했을 때 첫 열부터 해당 열까지,, 에 대한 조건
2. 그 다음 그 서브쿼리를 이용해서 "누적 무게"가 1000 이하인 열들 중, 가장 큰 누적무게에 해당하는 행 골라주기
3. 2에서 고른 행의 person name SELECT 해주기
'Study > SQL' 카테고리의 다른 글
Union / Union All 예제 (2) | 2023.12.04 |
---|---|
SUB QUERY 예제 (0) | 2023.10.23 |
SQL : timestamp 다루기 (0) | 2023.10.17 |
SQL : Delete (0) | 2023.10.05 |
SQL : Update (0) | 2023.10.05 |