
이 문제 처음 봤을 때 솔직히 쉽다고 생각했다.
리스트, 딕셔너리. 기초잖아. 평균 구하고 필터링하면 되는 거잖아.
근데 내가 쓴 첫 코드를 보고 나서 — 이게 파이썬 맞나 싶었다.
문제 소개
학생들의 이름과 점수가 딕셔너리 리스트로 주어진다.
평균 점수를 구하고, 평균 이상인 학생들의 이름을 뽑아내는 것.
| 항목 | 내용 |
|---|---|
| 입력 | [{"name": "Alice", "score": 85}, ...] 형태의 딕셔너리 리스트 |
| 출력 | 평균 점수 / 평균 이상 학생 이름 리스트 |
| 핵심 도구 | sum(), len(), 리스트 컴프리헨션 |
예제 입출력은 이렇다.
# 입력
[
{"name": "Alice", "score": 85},
{"name": "Bob", "score": 92},
{"name": "Charlie", "score": 78},
{"name": "David", "score": 95}
]
# 출력
평균 점수: 87.5
평균 이상 학생: ['Bob', 'David']
일단 for문부터 썼다
처음에 내가 짠 코드는 이랬다.
# 점수 추출
scores = []
for student in students:
scores.append(student["score"])
# 평균 계산
total = 0
for s in scores:
total += s
average = total / len(scores)
# 평균 이상 필터링
result = []
for student in students:
if student["score"] >= average:
result.append(student["name"])
동작은 한다. 결과도 맞다.
근데 이건 파이썬이 아니라 그냥 C 스타일로 파이썬 문법을 쓴 거다.
힌트에 적혀 있었다.
리스트 컴프리헨션을 사용하면 간결하게 작성할 수 있습니다
읽었는데, 손이 안 갔다. 컴프리헨션 문법이 익숙하지 않으니까 일단 아는 방식으로 썼다.
이해는 나중에 하자는 태도였다. 그게 문제였다.
리스트 컴프리헨션이 뭔지 제대로 봤다
기본 구조는 이렇다.
[표현식 for 변수 in 이터러블 if 조건]
처음엔 읽기 어렵다. 근데 구조를 뜯어보면 for문이랑 완전히 같다.
| for문 방식 | 리스트 컴프리헨션 |
|---|---|
| result = [] for x in items: result.append(x) |
result = [x for x in items] |
| result = [] for x in items: if x > 0: result.append(x) |
result = [x for x in items if x > 0] |
이걸 이 문제에 적용하면 딱 두 줄로 정리된다.
# 점수만 뽑기
scores = [student["score"] for student in students]
# 평균 이상 학생 이름 뽑기
above = [student["name"] for student in students if student["score"] >= average]
읽어보면 영어 문장처럼 읽힌다.
students안에 있는 각student에서,score가average이상인 것들만 골라서,
그name을 리스트로 만들어.
for문보다 오히려 의도가 명확하게 보인다.
억지로 줄이는 게 아니라, 파이썬이 원래 이 방식으로 쓰도록 설계된 거다.
평균 계산도 한 줄이면 된다
평균 구하는 것도 처음엔 이렇게 썼다.
total = 0
for s in scores:
total += s
average = total / len(scores)
파이썬에는 sum()이 있다. 그냥 이렇게 쓰면 된다.
average = sum(scores) / len(scores)
심지어 scores 리스트를 따로 만들지 않아도 된다.
컴프리헨션을 sum() 안에 바로 넣을 수 있다.
average = sum(s["score"] for s in students) / len(students)
이건 제너레이터 표현식이라고 부른다. 리스트를 만들지 않고 바로 순회하면서 합산한다.
데이터가 클수록 메모리 효율이 좋아진다. 지금 단계에서 외울 필요는 없고, 이런 게 있다는 정도만 알아두면 된다.
최종 코드
처음 코드랑 최종 코드를 나란히 놓으면 이렇다.
|
BEFORE — for문 방식
|
AFTER — 컴프리헨션
|
전체 함수로 합치면 이렇다.
def find_above_average_students(students):
scores = [s["score"] for s in students]
average = sum(scores) / len(scores)
above = [s["name"] for s in students if s["score"] >= average]
return average, above
전체 흐름 한눈에 보기
마무리
동작하는 코드랑 파이썬다운 코드는 다르다.
for문으로 쓴 코드도 틀리지 않았다. 근데 파이썬에는 더 자연스러운 방식이 있고,
그걸 쓰면 코드가 하려는 일이 더 잘 보인다.
리스트 컴프리헨션은 줄이기 위한 문법이 아니라, 의도를 드러내기 위한 문법이다.
다음 문제로 넘어갔다.
'크래프톤 정글 > 정글에서 문제풀기' 카테고리의 다른 글
| [정글 베이직 6] 백 트래킹 (1) | 2026.03.09 |
|---|---|
| [정글 베이직 5] 재귀 함수 완성 (0) | 2026.03.08 |
| [정글 베이직 4] 두 수의 합 완성 (0) | 2026.03.08 |
| [정글 베이직 3] 회문 판별 (0) | 2026.03.08 |
| [정글 베이직 2] 배열을 돌린다는 것 — (i, j) → (j, n-1-i) (0) | 2026.03.07 |