문제풀이/SQL(My sql)
[문제풀이] Leet code - Consecutive Numbers
kime2
2024. 7. 15. 11:22
출처
문제
연속으로 세 번 이상 나타나는 모든 숫자를 찾습니다.
순서에 관계없이 결과 테이블을 반환합니다.결과 형식은 다음 예제와 같습니다.
문제에 대한 해석
연속된 세번이상의 숫자라고
아이디가 순차적으로 나열되어야 한다
또한 아이디가 중간에 끊기면 안되는것 같다
![]() |
![]() |
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

- FROM 절: logs테이블을 t1,t2,t3로 별칭하여세번 조인하는데
- WHERE 절
- t1의 id가 t2의 id보다 1이 크고
- t2의 id가 t3의 id보다 1이 커야 한다
- 이때의 각id의 num이 동일할 경우
- 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큰수와 같은 조건을 부여하는 경우는 연속된 숫자를 찾는데 유용하다