알고리즘/Programmers

[Programmers/Python] [PCCE 기출문제] 10번 / 데이터 분석도움말

댕주 2024. 11. 9. 10:53

언어: Python

1. 문제

data = [[1, 20300104, 100, 80], [2, 20300804, 847, 37], [3, 20300401, 10, 8]]

 

 


2. 문제 분석

여기서 고려할 부분은 필터링과 정렬 기준인 ext와 sort_by가 동적으로 바뀐다는 것이다. 코드를 작성할 때 ext와 sort_by 값에 따라 유연하게 접근할 필요가 있다고 생각했다.

이런 경우, 컬럼 이름에 따른 인덱스 매핑을 사용하면 편리하다. ext와 sort_by를 인덱스에 매핑하여 동적으로 데이터에 접근하면 필터링 및 정렬 기준이 바뀌더라도 쉽게 코드에 반영할 수 있다.

 

+ 제한사항 분석

  1. 데이터 크기:
    data의 길이는 최대 500개로 제한된다. 따라서 O(n log n) 복잡도의 정렬을 사용해도 성능 문제는 발생하지 않는다.
  2. 값의 범위와 형식:
    code, maximum, remain 등의 값은 주어진 범위 내에서 유효한 정수이다. 예외 상황은 없으므로 이 값들에 대해 별도의 유효성 검사는 필요 없다.
    date 값은 yyyymmdd 형식의 정수로 제공되며, 이 값도 정수형 정렬 기준으로 문제없이 다룰 수 있다.
  3. 정렬 기준:
    sort_by 값이 동일한 경우는 없다고 명시되어 있기 때문에 안정적인 정렬 결과가 보장되며, 정렬 시 특별한 예외 처리는 필요하지 않다.

3. 문제 풀기

def solution(data, ext, val_ext, sort_by):
    # 컬럼 인덱스 매핑 (컬럼명을 인덱스로 변환)
    columns = ["code", "date", "maximum", "remain"]
    ext_index = columns.index(ext)
    sort_index = columns.index(sort_by)
    
    # 조건에 맞는 데이터 필터링 및 정렬
    filtered_sorted_data = sorted(
        (row for row in data if row[ext_index] < val_ext), # 필터링 조건 적용
        key = lambda x: x[sort_index] # 정렬 기준 적용
    )
    
    return filtered_sorted_data

 

  • 컬럼 인덱스 매핑:
    1.
    columns = ["code", "date", "maximum", "remain"]
    컬럼 이름을 모아높은 리스트이다. 각 컬럼의 이름을 문자열로 저장해서, 인덱스를 통해 각 컬럼을 참조할 수 있도록 만든다
    예를 들어, "code" 는 인덱스 0, "date" 는 인덱스 1에 해당한다.

    2. ext_index = columns.index(ext)
    columns.index(ext)ext해당하는 컬럼의 인덱스를 찾아 ext_index 변수에 저장한다. 이 방식으로 필터링할 컬럼을 동적으로 지정할 수 있다.
    예를 들어, ext 가 "remain" 이라면 columns.index("remain") 은 3을 반환한다. 그러면 ext_index 는 3이 되어서, 나중에 데이터를 필터링할 때 remain 값이 기준이 된다.

    3. sort_index = columns.index(sort_by)
    이 부분은 정렬할 컬럼의 인덱스를 찾는 과정이다. sort_by 에 전달된 값에 따라 정렬 기준 컬럼을 동적으로 설정할 수 있다.
    예를 들어, sort_by 가 "maximum" 이라면 columns.index("maximum") 은 2를 반환한다. 그러면 sort_index 는 2가 되고, 이후 sorted() 함수에서 이 인덱스를 기준으로 정렬을 수행한다.

  • 조건에 따른 필터링 및 정렬:
    data 에서 ext_index 로 지정된 컬럼이 val_ext 보다 작은 행(row)들만 추출하여, sort_index 컬럼을 기준으로 오름차순 정렬한 결과를 filtered_sorted_data 에 저장한다.

    1. (row for row in data if row[ext_index] < val_ext)
    이 부분은 제너레이터 표현식으로, data 의 각 행 row 를 조건에 맞게 필터링 하는 역할이다.
    - for row in data: data 리스트의 각 행(row)을 반복한다
    - if row[ext_index] < val_ext: rowext_index 컬럼 값이 val_ext 보다 작은 경우에만 해당 row를 반환한다.

    2. sorted(..., key=lambda x: x[sort_index])
    sorted() 함수는 이터러블을 정렬하여 새로운 리스트를 반환한다. 여기서 정렬 기준key 매개변수로 지정하여 특정 컬럼을 기준으로 정렬할 수 있다.
    - key=lambda x: x[sort_index]: lambda 함수를 통해 각 행 x 에서 sort_index 위치의 값을 반환하여 정렬 기준으로 사용한다.