언어: 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를 인덱스에 매핑하여 동적으로 데이터에 접근하면 필터링 및 정렬 기준이 바뀌더라도 쉽게 코드에 반영할 수 있다.
+ 제한사항 분석
- 데이터 크기:
data의 길이는 최대 500개로 제한된다. 따라서 O(n log n) 복잡도의 정렬을 사용해도 성능 문제는 발생하지 않는다. - 값의 범위와 형식:
code, maximum, remain 등의 값은 주어진 범위 내에서 유효한 정수이다. 예외 상황은 없으므로 이 값들에 대해 별도의 유효성 검사는 필요 없다.
date 값은 yyyymmdd 형식의 정수로 제공되며, 이 값도 정수형 정렬 기준으로 문제없이 다룰 수 있다. - 정렬 기준:
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: row의 ext_index 컬럼 값이 val_ext 보다 작은 경우에만 해당 row를 반환한다.
2. sorted(..., key=lambda x: x[sort_index])
sorted() 함수는 이터러블을 정렬하여 새로운 리스트를 반환한다. 여기서 정렬 기준을 key 매개변수로 지정하여 특정 컬럼을 기준으로 정렬할 수 있다.
- key=lambda x: x[sort_index]: lambda 함수를 통해 각 행 x 에서 sort_index 위치의 값을 반환하여 정렬 기준으로 사용한다.
'알고리즘 > Programmers' 카테고리의 다른 글
[Programmers/Java] 서버 증설 횟수 (0) | 2025.03.24 |
---|---|
[Programmers/Python] 추억 점수 (0) | 2024.11.17 |
[Programmers/Python] [PCCP 기출문제] 2번 / 퍼즐 게임 챌린지 (2) | 2024.11.09 |
[Programmers/Python] 달리기 경주 (0) | 2024.11.09 |