홍동이의 성장일기

[LeetCode] 626. Exchange Seats 본문

Tool/SQL 코딩테스트 풀이

[LeetCode] 626. Exchange Seats

홍동2 2023. 10. 15. 09:00

 

Exchange Seats - LeetCode

Can you solve this real interview question? Exchange Seats - Table: Seat +-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | student | varchar | +-------------+---------+ id is the primary key (unique value) column for

leetcode.com

 

연속하는 두 학생마다 자리 ID를 바꿀 수 있는 해를 작성합니다. 학생 수가 홀수이면 마지막 학생의 ID를 교환하지 않습니다. id 순으로 정렬된 결과 테이블을 오름차순으로 반환합니다.

 

WITH cte_t AS(
        SELECT *
                , COUNT(*) OVER () as tot
        FROM seat
)
SELECT CASE
            WHEN MOD(id, 2) = 1 AND id <> tot THEN id + 1
            WHEN MOD(id, 2) = 1 AND id = tot THEN id
            ELSE id - 1
        END as id
        , student
FROM cte_t
ORDER BY id

 

 

💡 문제 풀이

 

[new id]

  • 학생의 수가 짝수일 때
    • 짝수 번호인 학생: id - 1
    • 홀수 번호인 학생: id + 1
  • 학생의 수가 홀수일 때
    • 마지막 학생(id가 홀수): 원래 id

 

SELECT *
        , CASE
            WHEN MOD(id, 2) = 1 THEN id + 1
            ELSE id - 1
          END as new_id
FROM seat

전체 학생 수가 짝수라고 가정하고 코드를 작성하면 마지막 학생의 id에도 영향을 주게 됩니다. 

 

 

 

 

 

 

SELECT *
        , COUNT(*) OVER () as tot
FROM seat

 

CASE
	-- #1
    WHEN MOD(id, 2) = 1 AND id <> tot THEN id + 1
    -- #2
    WHEN MOD(id, 2) = 1 AND id = tot THEN id
    -- #3
    ELSE id - 1
END

각 학생에게 적절한 번호를 부여하기 위해서 CASE문을 사용합니다.

#1: 번호가 홀수이고 id가 전체 학생 수와 다를 경우 id에 1을 더해줍니다.

#2: 번호가 홀수이고 id가 전체 학생 수와 같은 경우 id를 그대로 나타내줍니다.

#3: 번호가 짝수일 경우는 id에서 1을 빼줍니다.

 

➡️ 식 자체는 어렵지 않지만 적절한 수식을 작성하기 위해 고민을 많이 해야하는 문제였습니다.

 


📍 본 내용은  '[백문이불여일타] 데이터 분석을 위한 고급 SQL 문제풀이'를  수강하며 작성한 내용입니다.

728x90
Comments