SQL/문제풀이

[LeetCode] exchange-seats 📌

응엉잉 2024. 3. 20. 16:29

https://leetcode.com/problems/exchange-seats/?envType=study-plan-v2&envId=top-sql-50

SELECT a.id,
    CASE 
        WHEN a.id % 2 = 1 THEN b.student
        ELSE c.student END
    AS student
FROM seat a
    LEFT JOIN seat b ON a.id + 1 = b.id
    LEFT JOIN seat c ON a.id = c.id + 1

id가 홀수인 경우와 짝수인 경우를 나눠서 문제를 해결하려고 했는데 table의 마지막 열에 대해서 어떻게 처리가 안되더라 ..

원래 table은 다음과 같다.

SELECT
	CASE
    	WHEN id = (SELECT MAX(id) FROM seat) AND id % 2 = 1 THEN id -- MAX가 홀수열인 경우 id
        WHEN id % 2 = 1 THEN id + 1 -- 홀수열은 다음 id
        ELSE id - 1 -- 짝수열은 이전 id
	END AS id,
    student
FROM seat

id만 뽑아보면 다음과 같다.

name은 원래 있던 순서대로 나온다.

id가 이 name들이 가야할 위치 index 역할을 한다고 생각하면 될듯?

그래서 이제 id로 ORDER BY 해줘야 한다.

 

종합하면 다음과 같다.

원래 테이블은 이렇게 생겼고

다음 쿼리가 정답쿼리이다.

SELECT
	CASE
    	WHEN id = (SELECT MAX(id) FROM seat) AND id % 2 = 1 THEN id -- MAX가 홀수열인 경우 id
        WHEN id % 2 = 1 THEN id + 1 -- 홀수열은 다음 id
        ELSE id - 1 -- 짝수열은 이전 id
	END AS id,
    student
FROM seat
ORDER BY id