[코딩테스트]/[Pandas]

[LeetCode - Pandas] (Medium) 180. Consecutive Numbers

잰잰' 2025. 5. 28. 17:28
Table: Logs

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| num         | varchar |
+-------------+---------+

SQL에서, id는 이 테이블의 기본 키입니다.
id는 1부터 시작하는 자동 증가 열입니다.

 

문제

연속으로 세 번 이상 나타나는 모든 숫자를 찾으십시오.

결과 테이블은 임의의 순서로 반환됩니다.

결과 형식은 다음 예시와 같습니다.

Example 1:

Input: 
Logs table:
+----+-----+
| id | num |
+----+-----+
| 1  | 1   |
| 2  | 1   |
| 3  | 1   |
| 4  | 2   |
| 5  | 1   |
| 6  | 2   |
| 7  | 2   |
+----+-----+
Output: 
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1               |
+-----------------+

설명 : 1은 연속으로 세 번 이상 나타나는 유일한 숫자입니다.

 

✏️  풀이

import pandas as pd

def consecutive_numbers(logs: pd.DataFrame) -> pd.DataFrame:
    logs.sort_values(by='id', inplace=True)

    logs['previous'] = logs['num'].shift(1)
    logs['next'] = logs['num'].shift(-1)

    result = logs[(logs['num'] == logs['previous']) & (logs['num'] == logs['next'])]

    return result.drop_duplicates(subset='num', keep='first').rename(columns={'num' : 'ConsecutiveNums'})[['ConsecutiveNums']]

1. 각 로우의 이전, 이후 num값 추가

2. 현재 값, 이전 값, 이후 값이 같은 데이터 찾기

3. 중복 제거 후 컬럼명 변경하여 조회

 

📚  개념정리

shift() ? Series나 DataFrame의 값을 위나 아래로 밀어서 이동시키는 함수

이전 행의 값과 비교하거나 시계열 데이터를 다룰 때 많이 사용

# 기본 사용법 #
import pandas as pd

s = pd.Series([10, 20, 30, 40])
print(s.shift())

# 결과 #
0     NaN
1    10.0
2    20.0
3    30.0
dtype: float64

 

- shift()는 기본적으로 periods=1이고, 아래로 한 칸 이동

- 첫 번째 값은 위에 아무 것도 없으므로 NaN

 

주요 파라미터

1. periods (기본값 : 1)

- 이동할 행의 수

- 양수 : 아래로 이동 (이전 값처럼 사용)

- 음수 : 위로 이동 (다음 값처럼 사용)

s.shift(2)     # 아래로 2칸
s.shift(-1)    # 위로 1칸

 

 

2. fill_value

- NaN 대신 지정된 값으로 채우기

s.shift(1, fill_value=0)