홍동이의 성장일기
[LeetCode] 626. Exchange Seats 본문
연속하는 두 학생마다 자리 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
'Tool > SQL 코딩테스트 풀이' 카테고리의 다른 글
[LeetCode] 177. Nth Highest Salary (0) | 2023.12.11 |
---|---|
[LeetCode] 176. Second Highest Salary (0) | 2023.12.10 |
[LeetCode] 178. Rank Scores (0) | 2023.10.14 |
[HackerRank] Weather Observation Station 20 (0) | 2023.10.13 |
[HackerRank] Weather Observation Station 11 (0) | 2023.10.13 |
Comments