문제
문제 : https://school.programmers.co.kr/learn/courses/30/lessons/250121
AI 엔지니어인 현석이는 코드 번호(code), 제조일(date), 최대 수량(maximum), 현재 수량(remain)으로 구성된 데이터를 분석하고 있는데, 조건을 만족하는 데이터만 뽑아서 정렬하려고 한다.
데이터가 저장된 이차원 정수 리스트 datam, 데이터를 필터링할 기준을 의미하는 문자열 ext, 필터링할 기준값을 의미하는 정수 val_ext, 정보를 정렬하는 기준을 의미하는 문자열 sort_by가 주어질 때, data에서 ext 값이 val_ext보다 작은 데이터만 뽑은 후, sort_by 값을 기준으로 오름차순으로 정렬하여 반환한다.
접근
Pandas를 사용하라고 만든 문제는 아닐 것 같지만…… Pandas를 이용하면 매우 쉽게 풀어낼 수 있을 것 같은 문제로 보인다.
데이터 길이가 500으로 길지 않아서 Pandas를 사용해도 성능 상의 이점은 전혀 없겠으나, 문제 풀이 환경에 Pandas도 설치되어 있으므로 Pandas를 사용해 문제를 풀어본다.
풀이
1. 주어진 data로 DataFrame 생성
df = pd.DataFrame(data, columns=['code', 'date', 'maximum', 'remain'])
2. 데이터 필터링 및 정렬
df = df[df[ext] < val_ext].sort_values(sort_by)
데이터에 날짜값이 포함되어 있어서 습관적으로 date 값을 datetime형으로 변환하려고 했는데, 데이터가 문자열이 아니라 정수형이다. 따라서 달리 처리하지 않아도 문제없이 비교 연산을 수행할 수 있었다.
3. 데이터를 리스트로 변환하여 반환
return df.values.tolist()
전체 코드는 아래와 같다.
import pandas as pd
def solution(data, ext, val_ext, sort_by):
df = pd.DataFrame(data, columns=['code', 'date', 'maximum', 'remain'])
df = df[df[ext] < val_ext].sort_values(sort_by)
return df.values.tolist()
Pandas를 이용하지 않는 풀이
굳이 Pandas를 사용하지 않아도 쉽게 문제를 해결할 수 있어, Pandas를 이용하지 않는 코드도 적어둔다.
1. 데이터의 순서 정의
데이터 구성 순서에 맞게 데이터 이름을 정리한다. columns에서의 ext의 인덱스 값을 이용해 데이터의 ext 값을 접근할 수 있어야 한다.
columns = ['code', 'date', 'maximum', 'remain']
2. 데이터 필터링
1에서 정의한 columns와 리스트 컴프리헨션을 활용해 데이터를 필터링한다.
data = [d for d in data if d[columns.index(ext)] < val_ext]
3. 데이터 정렬
필터링할 때와 마찬가지로 columns와 lambda를 활용해 sort_by 값으로 데이터를 정렬한다.
data.sort(key=lambda x: x[columns.index(sort_by)])
그리고 결과 데이터를 그대로 반환한다. 전체 코드는 아래와 같다.
def solution(data, ext, val_ext, sort_by):
columns = ['code', 'date', 'maximum', 'remain']
data = [d for d in data if d[columns.index(ext)] < val_ext]
data.sort(key=lambda x: x[columns.index(sort_by)])
return data
참고 문서
https://school.programmers.co.kr/learn/courses/30/lessons/250121