[코딩테스트]/[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)