[SQL ps] Leetcode 626. Exchange Seats

이찬행·2022년 5월 13일

SQL-문제풀이

목록 보기
7/7

문제

문제 링크

문제

문제 풀이

  1. 문제에 나와 있는 것처럼 2가지의 케이스가 존재
    1. 가장 큰 id가 홀수인 경우 -> 가장 큰 id만 고정 후, 홀수 id =id+1, 짝수 id = id-1
    2. 가장 큰 id가 짝수인 경우 -> 홀수 id = id+1, 짝수 id=id-1
SELECT CASE WHEN MOD(id, 2) != 0 AND id=(SELECT COUNT(*) FROM Seat) THEN id
		#가장 큰 id 가 홀수 인 경우 가장 큰 id 값 고정
            WHEN MOD(id, 2) != 0 AND id!=(SELECT COUNT(*) FROM Seat) THEN id+1
        #가장 큰 id가 홀수 인 경우 나머지 odd ids = id-1
            ELSE id-1
        #even ids = id=1
            END AS id, student
FROM Seat
ORDER BY 1 ASC;
            
  • 하지만 별로 빠르지 않다
#아래의 경우처럼 사용하면 하나의 row만 반환된다
SELECT CASE WHEN MOD(id, 2) != 0 AND id=COUNT(*) THEN id
            WHEN MOD(id, 2) != 0 AND id!=COUNT(*) THEN id+1
            ELSE id-1
            END AS id, student
FROM Seat
ORDER BY 1 ASC;

## runtime: 394 ms
  1. left join을 이용한 방법
  • 일단 하나의 테이블을 만드는데, 홀수는 아이디가 +!, 짝수는 아이디가 -1 된 테이블을 만든다.
  • 이 경우 맨 끝의 id가 홀수라면 짝수로 바뀌어 있는데, 수정된 id를 오른쪽에 놓고 기존의 id를 왼쪽에 놓고 left join을 시켜준다면, 맨 마지막의 id는 왼쪽 테이블에 없기 때문에 사라진다. 이때 COALESCE 함수를 이용해 student name 을 받아 온다
SELECT s1.id,
	COALESCE(s2.student, s1.student) AS student
    # coalesce 함수는 null 값이 아닌 첫 번째 값을 불러온다
FROM seat s1
    LEFT JOIN
     seat s2 ON (s1.id+1)^1-1 = s2.id
     #(s1.id+1)^1-1 은 odd id +=1, even id-=1 이 된다
ORDER BY s1.id;

## runtime: 268 ms

cat operator(^) in sql
: ^ operator는 XOR을 뜻한다. 숫자를 binary form으로 바꾸어준 뒤 각 자리에 XOR을 적용시킨 뒤 반환되는 값이다.
예: 2^3 = 1
2 = 010
3 = 011
2^3 = 001 = 1

  1. lag와 lead function을 이용한 방법
  • 위의 방법과 비슷하게,
    짝수는 한칸 올려주고, 홀수는 한칸 밑으로 이동하면 되지 않을까?
# 기본 아이디어
# 이렇게 하게 되면, 맨 마지막은 lead 되어 null 값
## 따라서 ifnull 함수 또는 COALESCE 함수 사용
SELECT id, IFNULL(CASE WHEN id%2!=0 #when id is odd
		        THEN LEAD(student) OVER()
                ELSE LAG(student) OVER()
                END) AS student
FROM seat
;

## runtime: 371 ms
profile
what's on your mind?

0개의 댓글