susinlee 님의 블로그

109. Consecutive Numbers 본문

코드카타/Pandas

109. Consecutive Numbers

susinlee 2025. 1. 17. 10:24

[문제]

https://leetcode.com/problems/consecutive-numbers/description/

 

[풀이]

1. 이전 행의 num 값과 다음 행의 num 값을 불러와서 현재 num 값과 비교한 후 같다면 해당 num을 반환하면 된다.

2. shift 함수로 이를 구현하고 num을 반환할 때 중복제거를 해주자.

 

Pandas

import pandas as pd

def consecutive_numbers(logs: pd.DataFrame) -> pd.DataFrame:
    logs['lag'] = logs.num.shift(1)
    logs['lead'] = logs.num.shift(-1)

    return pd.DataFrame({
        'ConsecutiveNums' : logs[(logs.num==logs.lag) & (logs.num==logs.lead)]['num'].unique()
    })

 

다른 방법으로는 rolling 함수를 통해 슬라이딩 윈도우 기법을 구현해서 분산값을 구해주면 되는데

세 개의 값(window=3) 에서 분산이 0이면 값의 차이가 없다는 뜻이 되므로 이를 이용해준다.

import pandas as pd

def consecutive_numbers(logs: pd.DataFrame) -> pd.DataFrame:
    logs['var'] = logs['num'].rolling(window=3).var()
    
    return pd.DataFrame({
        'ConsecutiveNums' : logs[logs['var']==0]['num'].unique()
    })

 

SQL

SELECT
    DISTINCT(num) AS ConsecutiveNums
FROM
(
    SELECT
        *
        , LAG(num) OVER() AS num_log
        , LEAD(num) OVER() AS num_lead
    FROM Logs
) sub
WHERE 
    num = num_log
    AND num = num_lead