본문 바로가기
코딩테스트/프로그래머스

프로그래머스 | Python | 단순구현 | [PCCE 기출문제] 10번 / 데이터 분석 (Lv.1)

by RuntimeSimple 2025. 2. 26.

https://school.programmers.co.kr/learn/courses/30/lessons/250121

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

코드

def solution(data, ext, val_ext, sort_by):
    # ext와 sort_by에 해당하는 인덱스 매핑
    column_map = {"code": 0, "date": 1, "maximum": 2, "remain": 3}
    ext_idx = column_map[ext]        # 필터링 조건에 해당하는 인덱스
    sort_idx = column_map[sort_by]  # 정렬 기준에 해당하는 인덱스

    # 조건에 맞는 데이터 필터링
    filtered_data = [row for row in data if row[ext_idx] < val_ext]

    # 정렬 기준에 따라 오름차순 정렬
    sorted_data = sorted(filtered_data, key=lambda x: x[sort_idx])

    return sorted_data

코드 해설

  1. 필터링 조건
    •   주어진 데이터(data) 중 ext 열의 값이 val_ext보다 작은 데이터만 선택합니다.
    •   예를 들어, ext = "date"이고 val_ext = 20300501이면 제조일이 20300501 이전인 데이터만 남깁니다.
  2. 정렬 기준
    •   필터링된 데이터에서 sort_by 열을 기준으로 오름차순 정렬합니다.
    •   예를 들어, sort_by = "remain"이면 현재 수량 기준으로 정렬합니다.
  3. 컬럼 매핑
    •   ext와 sort_by는 문자열 형태이므로 이를 column_map 딕셔너리를 이용해 열(column) 번호로 변환합니다.
    •   "code" → 0, "date" → 1, "maximum" → 2, "remain" → 3.
  4. 리스트 컴프리헨션
    •   데이터 필터링에는 리스트 컴프리헨션을 사용해 간결하고 효율적으로 구현했습니다.
  5. sorted() 함수
    •   lambda x: x[sort_idx]를 활용하여 정렬 기준 열(sort_by)에 따라 데이터를 정렬합니다.
    •   lambda x: x[sort_idx] 분석
      •   filtered_data 리스트의 각 요소(x)는 리스트 형태입니다.
      •   x[sort_idx]는 x 리스트에서 sort_idx 위치에 있는 값입니다.
      •   즉, sort_idx 번째 값을 기준으로 filtered_data를 정렬합니다.

예제: 숫자 리스트 정렬

data = [[1, 30], [2, 10], [3, 20]]
sorted_data = sorted(data, key=lambda x: x[1])  # 두 번째 값을 기준으로 정렬
print(sorted_data)

 출력: [[2, 10], [3, 20], [1, 30]]

기본적으로 오름차순 정렬이 적용됩니다.


문제의 핵심 포인트

  1. 딕셔너리로 열(column) 매핑
    •   ext와 sort_by는 문자열 형태로 주어지므로, 이를 숫자 인덱스와 매핑하는 딕셔너리 활용이 중요합니다.
  2. 리스트 컴프리헨션과 조건 필터링
    •   데이터 분석 문제에서는 특정 조건에 맞는 데이터를 효율적으로 필터링하는 능력이 중요합니다.
    •   리스트 컴프리헨션을 활용하면 간결하고 성능도 좋습니다.
  3. 정렬 알고리즘의 이해
    •   Python의 sorted() 함수는 Timsort 알고리즘을 사용하며, 안정적인 정렬과 효율성을 보장합니다.
    •   key를 활용하여 특정 열을 기준으로 정렬할 수 있습니다.
  4. 출제 의도
    •   데이터 필터링 및 정렬 알고리즘 활용 능력을 평가합니다.
    •   조건 기반의 문제 해결 능력을 테스트합니다.

코드 실행 흐름 상세 설명

입력 데이터

data = [
    [1, 20300104, 100, 80],
    [2, 20300804, 847, 37],
    [3, 20300401, 10, 8]
]
ext = "date"       # 필터링 기준
val_ext = 20300501 # 필터링 값
sort_by = "remain" # 정렬 기준

1. column_map을 이용해 인덱스 매핑

column_map = {"code": 0, "date": 1, "maximum": 2, "remain": 3}
ext_idx = column_map[ext]       # "date" → 1
sort_idx = column_map[sort_by]  # "remain" → 3
  •   ext_idx = 1 (제조일 기준으로 필터링)
  •   sort_idx = 3 (현재 수량 기준으로 정렬)

2. 데이터 필터링 (조건: date < 20300501)

filtered_data = [row for row in data if row[ext_idx] < val_ext]
  • 원본 데이터:
[[1, 20300104, 100, 80],
 [2, 20300804, 847, 37],
 [3, 20300401, 10, 8]]
  • date < 20300501을 만족하는 데이터만 남김:
[[1, 20300104, 100, 80],
 [3, 20300401, 10, 8]]

3. 정렬 (기준: remain 오름차순)

sorted_data = sorted(filtered_data, key=lambda x: x[sort_idx])
  • remain(현재 수량) 값:
    • [1, 20300104, 100, 80] → remain = 80
    • [3, 20300401, 10, 8] → remain = 8
  • 정렬 후 결과:
[[3, 20300401, 10, 8],  # remain = 8
 [1, 20300104, 100, 80]]  # remain = 80

최종 출력

[[3, 20300401, 10, 8], [1, 20300104, 100, 80]]

제조일(date)이 20300501보다 작은 데이터만 필터링한 후, 현재 수량(remain) 기준으로 정렬됨.


요약

  1. date < 20300501 조건을 만족하는 행만 필터링
  2. remain 값을 기준으로 오름차순 정렬
  3. 최종 결과 반환