오랑우탄의 반란
LeetCode 리트코드 | 626. Exchange Seats (MySQL) CASE, LAG/LEAD, ROW_NUMBER 본문
LeetCode 리트코드 | 626. Exchange Seats (MySQL) CASE, LAG/LEAD, ROW_NUMBER
5&2 2024. 8. 1. 11:46
오늘도 오랑이는 문제를 풉니다.
626. Exchange Seats
풀이 과정
이번 문제에서는 다양한 풀이를 살펴볼 예정입니다.
1 max()
우선 첫번째 풀이입니다.
이 풀이는 id 번호를 변경해서 student 를 거기에 맞춰주는 형식입니다.
id가 홀수인 경우, 1을 더해주고, id가 홀수인 경우 1을 빼줍니다. 마지막 id가 홀수인 경우 그대로 둬야 하기 때문에 그거에 대한 조건도 적어줍니다.
select case when id = (select max(id) from seat) and id % 2 = 1 then id
when id % 2 = 1 then id + 1
else id - 1 end as id,
student
from seat
order by id
id 번호를 변경해주면 아래와 같은 결과물이 출력됩니다.
이에 대해 다시 order by id 로 기존의 id에 맞게 student 를 정렬해줍니다.
복잡한 함수 사용 없는 가장 간단해 보이는 풀이지만 개인적으로 정렬방식이 한눈에 와닿지는 않았는데요, 다른 풀이도 같이 봅시다.
2 lag, lead 윈도우 함수
두번째 풀이는 LAG, LEAD 를 활용한 풀이입니다.
좀 더 직관적인데요, id는 그대로 두고 student 칼럼을 정렬하는 방식이어서 저는 더 와닿았습니다.
마찬가지로 id 를 2로 나눴을 때 나머지가 0 즉 짝수이면 이전 행의 student 를 반환합니다.
반대로 홀수인 경우 다음 행의 student 를 반환하며, 다음 행이 없을 경우 자기자신 id의 student를 반환합니다.
SELECT id,
CASE WHEN MOD(id,2)=0 THEN (LAG(student) OVER (ORDER BY id))
ELSE (LEAD(student, 1, student) OVER (ORDER BY id))
END AS 'Student'
FROM Seat
lag/lead 를 사용한 풀이의 경우, order by 없이도 자동으로 함수 실행 과정에서 의도대로 정렬된다는 점에서 편리합니다.
3 row_number 윈도우 함수
마지막 풀이는 row_number 를 활용한 풀이입니다.
ROW_NUMBER: 순위를 매겨주는 윈도우 함수로, 동일한 값이 있어도 유일한 순위를 부여해줍니다.
정렬 순서가 조건문으로 설정되어 있습니다.
짝홀 판별에 따라 짝수인 경우 id-1 을 순서로 지정, 홀수인 경우 id+1을 순서로 지정해줍니다.
SELECT ROW_NUMBER() OVER(order by IF(MOD(id, 2) = 0, id-1, id+1) ) as id, student
FROM seat
실행 결과를 쪼개서 살펴봅시다.
- id = 1 (홀): id + 1 = 2
- id = 2 (짝): id - 1 = 1
- id = 3 (홀): id + 1 = 4
- id = 4 (짝): id - 1 = 3
- id = 5 (혹): id + 1 = 6
student [Abbot, Doris, Emerson, Green, Jeames] 에 대해서 최종 순서 [2, 1, 4, 3, 6] 가 부여되어 순서대로 재정렬됩니다.
최종적으로 마지막 풀이방식이 가장 효율적이며, 원리만 제대로 이해하면 활용도가 높은 풀이방식인 것 같습니다.
오랑우탄이 영어를 하고 오랑이가 쿼리마스터가 되는 그날까지~
'SQL > LeetCode' 카테고리의 다른 글
LeetCode 리트코드 | 1321. Restaurant Growth (MySQL) (0) | 2024.08.05 |
---|---|
LeetCode 리트코드 | 1341. Movie Rating (MySQL) (0) | 2024.08.02 |
LeetCode 리트코드 | 1907. Count Salary Categories (MySQL) Union (0) | 2024.07.23 |
LeetCode 리트코드 | 1204. Last Person to Fit in the Bus (MySQL) 윈도우 함수 (0) | 2024.07.23 |
LeetCode 리트코드 | 1164. Product Price at a Given Date (MySQL) CTE, DENSE_RANK, UNION (0) | 2024.07.22 |