본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] Leet code - Consecutive Numbers

by kime2 2024. 7. 15.
출처

 

문제

연속으로 세 번 이상 나타나는 모든 숫자를 찾습니다.
순서에 관계없이 결과 테이블을 반환합니다.결과 형식은 다음 예제와 같습니다.

문제에 대한 해석

연속된 세번이상의 숫자라고

아이디가 순차적으로 나열되어야 한다

또한 아이디가 중간에 끊기면 안되는것 같다

1이 네번 이상 연속적인것 같지만 

id가 1,2번 4,5번으로 연속적이라고 볼 수 없다

풀이(MYSQL)

-- 오답
with base as (
    select num
    , lead(num)over(order by id) as 'num1'
    , lead(num,2)over(order by id) as 'num2'
from Logs
)
select distinct num as 'ConsecutiveNums'
from base
where num = num1
and num1 = num2

위와 같은 문제로

각 행을 하나씩 올려서 각 컬럼(num,num1,num2)가 같은 경우를 선택하면 id가 순차적인지 알 수 없다

id3이 누락된걸 반영하지 못한다

 

정답들

SELECT distinct(t1.num) as ConsecutiveNums 
FROM logs t1, logs t2 , logs t3
WHERE t1.id=t2.id+1 AND t2.id=t3.id+1 AND t1.num=t2.num AND t2.num=t3.num
  1. FROM 절: logs테이블을 t1,t2,t3로 별칭하여세번 조인하는데
  2. WHERE 절
    1. t1의 id가  t2의 id보다 1이 크고
    2. t2의 id가  t3의 id보다 1이 커야 한다
    3. 이때의 각id의 num이 동일할 경우
  3. SELECT 절:t1의 num을 중복없이 조회하여 ConsecutiveNums로 별칭하라

distinct를 사용하는 이유는 세번이상의 숫자일 경우

중복하여 나오는 값을 제거하기 위함이다

위의 사진처럼 1~4까지 숫자가 동일한데

답은 1~3, 2~4의id가 동일하기 때문에 3이 두번나온다

 

문제에 따르면 연속된 숫자가 3번이상 으로

4번의 연속된 숫자가 나와도 답은 1번으로 인정된다

배운점

  • ROM logs t1, logs t2 , logs t3 WHERE t1.id=t2.id+1 AND t2.id=t3.id+1 
  • 동일한 테이블을 조인하여 1큰수와 같은 조건을 부여하는 경우는 연속된 숫자를 찾는데 유용하다