본문 바로가기
Data Science/SQL

[SQL/오답] 연속된 ID 스왑(Swap)하기: MOD 함수와 스칼라 서브쿼리의 활용 (LeetCode626 Medium)

by 에르모사 쩐뉴 2026. 2. 6.

626. Exchange Seats; 스칼라 서브쿼리, MOD함수

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

1. Problem

인접한 두 학생의 좌석 ID를 서로 바꿔야 한다.

  • 핵심 조건:
    1. 홀수 번호 ID(1, 3, 5...)는 다음 번호(+1)로 보낸다.
    2. 짝수 번호 ID(2, 4, 6...)는 이전 번호(-1)로 보낸다.
    3. 예외: 전체 학생 수가 홀수일 때, 마지막 학생은 자리를 바꾸지 않는다.

2. Solution: CASE문을 이용한 세 가지 조건 분기

나머지 연산(MOD)을 통해 홀/짝을 구분하고, 서브쿼리로 전체 개수를 파악하여 예외를 처리한다.

3. Takeaway: 왜 COUNT(*)를 서브쿼리로 감싸야 하는가? (객관적 분석)

  • 집계 함수의 실행 시점 (오답 분석):
    • 오답: ... AND id = COUNT(*) ...
    • 원인: COUNT(*)는 테이블 전체를 요약하는 집계 함수이고, id는 각 행(Row)의 개별 값이다. SQL 엔진은 한 줄씩 데이터를 읽어 처리하는 SELECT 절 내에서 테이블 전체의 합계인 COUNT를 실시간으로 비교할 수 없다. (마치 1반 3번 학생에게 "너의 번호가 전교생 수와 같니?"라고 물을 때, 전교생 수를 미리 계산해두지 않으면 답할 수 없는 것과 같다.)
  • 스칼라 서브쿼리의 역할:
    • (SELECT COUNT(*) FROM Seat)처럼 괄호로 묶어 서브쿼리로 만들면, 엔진은 이 값을 단일 상수처럼 취급한다. 덕분에 각 행의 id와 비교가 가능해진다.
  • 정렬의 마법:
    • 데이터의 물리적 순서는 그대로지만, id 값을 1->2, 2->1로 바꾼 뒤 ORDER BY id를 해주면 결과적으로 학생의 이름이 서로 바뀐 것처럼 출력된다.

Table: Seat

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| student     | varchar |
+-------------+---------+
id is the primary key (unique value) column for this table.
Each row of this table indicates the name and the ID of a student.
The ID sequence always starts from 1 and increments continuously.
 

Write a solution to swap the seat id of every two consecutive students. If the number of students is odd, the id of the last student is not swapped.

Return the result table ordered by id in ascending order.

The result format is in the following example.

 

Example 1:

Input: 
Seat table:
+----+---------+
| id | student |
+----+---------+
| 1  | Abbot   |
| 2  | Doris   |
| 3  | Emerson |
| 4  | Green   |
| 5  | Jeames  |
+----+---------+
Output: 
+----+---------+
| id | student |
+----+---------+
| 1  | Doris   |
| 2  | Abbot   |
| 3  | Green   |
| 4  | Emerson |
| 5  | Jeames  |
+----+---------+
Explanation: 
Note that if the number of students is odd, there is no need to change the last one's seat.

 

1. 정답

SELECT 
    CASE 
        WHEN MOD(id, 2) = 1 AND id = (SELECT COUNT(*) FROM Seat) THEN id   # 단일값은 스칼라 서브쿼리로 묶기
        WHEN MOD(id, 2) = 1 THEN id + 1
        ELSE id - 1
    END AS id,
    student
FROM Seat
ORDER BY id; # 바뀐 ID 기준으로 정렬 필수!

 

2. 나의 오답

SELECT 
CASE
WHEN MOD(id,2) = 1 AND id = count(*) THEN id
WHEN MOD(id,2) = 1 THEN id+1
WHEN MOD(id,2) = 0 THEN id-1
END AS id,
student
FROM Seat
ORDER BY id;