[오늘의 문제] Article Views I

shlim55·2025년 12월 14일

코딩테스트

목록 보기
200/223

출처: https://leetcode.com/problems/article-views-i/description/?envType=study-plan-v2&envId=30-days-of-pandas&lang=pythondata

+---------------+---------+
| 열 이름 | 유형 |
+---------------+---------+
| 기사 ID | 정수 |
| 작성자 ID | 정수 |
| 뷰어 ID | 정수 |
| 보기 날짜 | 날짜 |
+---------------+---------+
이 테이블에는 기본 키(고유 값을 가진 열)가 없으므로 중복 행이 있을 수 있습니다.
이 표의 각 행은 특정 날짜에 특정 독자가 특정 저자가 작성한 기사를 읽었음을 나타냅니다.
author_id와 viewer_id가 같으면 동일 인물임을 나타냅니다.

자신의 논문을 최소 한 편 이상 조회한 모든 저자를 찾는 방법을 작성하세요.

결과 테이블을 id오름차순으로 정렬하여 반환합니다.

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

예시 1:

입력:
조회수 테이블:
+------------+-----------+-----------+------------+
| 기사 ID | 저자 ID | 시청자 ID | 조회 날짜 |
+------------+-----------+-----------+------------+
| 1 | 3 | 5 | 2019년 8월 1일 |
| 1 | 3 | 6 | 2019년 8월 2일 |
| 2 | 7 | 7 | 2019-08-01 |
| 2 | 7 | 6 | 2019년 8월 2일 |
| 4 | 7 | 1 | 2019년 7월 22일 |
| 3 | 4 | 4 | 2019년 7월 21일 |
| 3 | 4 | 4 | 2019년 7월 21일 |
+------------+-----------+-----------+------------+
산출:
+------+
| ID |
+------+
| 4 |
| 7 |
+------+

내가 한 풀이

import pandas as pd

def article_views(views: pd.DataFrame) -> pd.DataFrame:
    # 1. 저자 ID와 시청자 ID가 같은 경우만 필터링
    new_df = views[views['author_id'] == views['viewer_id']]
    # 2. 고유한 author_id만 추출한다. unique 활용
    unique_authors = new_df['author_id'].unique()

    # 3. 고유한 ID 목록을 'id' 컬럼을 가진 DataFrame으로 변환
    result_df = pd.DataFrame({'id': unique_authors})

    # 4. 'id' 컬럼을 기준으로 정렬한다. (groupby 대신 sort_values 사용)
    result_df = result_df.sort_values(by='id', ascending=True)
    return result_df

data = {
        'article_id': [1, 1, 2, 2, 4, 3, 3],
        'author_id': [3, 3, 7, 7, 7, 4, 4],
        'viewer_id': [5, 6, 7, 6, 1, 4, 4],
        'view_date': ['2019-08-01', '2019-08-02', '2019-08-01', '2019-08-02', '2019-07-22', '2019-07-21', '2019-07-21']
    }

views = pd.DataFrame(data) # 저자 ID 시청자 ID 같아야 함 

result = article_views(views)

print(result)

트러블 슈팅

우선, 맨처음에 한줄로 필터링 그룹바이 하고, 반환한다. 이렇게 생각했는데

한 줄 한줄 다 해야 했던것. 게다가 unique까지 빼먹었다 첨엔..

중복 안되게 unique를 써주고 sort_values를 하는 방법을 채택.

그리고 3번처럼 컬럼명 author_id에서 id로 바꾸는 방법도 첨 알았다.

제미나이의 그룹바이만 써서 푸는 코드

import pandas as pd

def article_views(views: pd.DataFrame) -> pd.DataFrame:
    # 1. 저자 ID와 시청자 ID가 같은 행만 필터링합니다.
    new_df = views[views['author_id'] == views['viewer_id']]
    
    # 2. 'author_id'를 기준으로 그룹화하고, 첫 번째 값(first())을 집계합니다.
    #    - as_index=False: 그룹 키(author_id)를 인덱스가 아닌 일반 컬럼으로 유지합니다.
    #    - sort=True: 그룹 키(author_id)를 오름차순으로 정렬합니다.
    #    - ['author_id']: 중복된 author_id를 제거하는 것이 목적이므로, 
    #                     author_id 컬럼에 대해서만 집계를 수행합니다. (다른 컬럼을 사용해도 무방)
    
    result_series = new_df.groupby(
        'author_id', 
        as_index=False, 
        sort=True
    )['author_id'].first()
    
    # 3. 컬럼 이름을 'id'로 변경하고 반환합니다.
    result_df = result_series.rename(columns={'author_id': 'id'})
    
    return result_df

# --- 데이터 및 실행 ---
data = {
    'article_id': [1, 1, 2, 2, 4, 3, 3],
    'author_id': [3, 3, 7, 7, 7, 4, 4],
    'viewer_id': [5, 6, 7, 6, 1, 4, 4],
    'view_date': ['2019-08-01', '2019-08-02', '2019-08-01', '2019-08-02', '2019-07-22', '2019-07-21', '2019-07-21']
}

views = pd.DataFrame(data)

result = article_views(views)

print(result)
profile
A Normal Programmer

0개의 댓글