오랑우탄의 반란

LeetCode 리트코드 | 626. Exchange Seats (MySQL) CASE, LAG/LEAD, ROW_NUMBER 본문

SQL/LeetCode

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] 가 부여되어 순서대로 재정렬됩니다. 

 

 

최종적으로 마지막 풀이방식이 가장 효율적이며, 원리만 제대로 이해하면 활용도가 높은 풀이방식인 것 같습니다. 

 


 

오랑우탄이 영어를 하고 오랑이가 쿼리마스터가 되는 그날까지~

 

 

https://leetcode.com/problems/exchange-seats/description/

반응형