크래프톤 정글/정글에서 문제풀기

[정글 베이직 1] 리스트 컴프리헨션 — 파이썬답게 쓴다는 것

cedis 2026. 3. 7. 23:42

 


이 문제 처음 봤을 때 솔직히 쉽다고 생각했다.

리스트, 딕셔너리. 기초잖아. 평균 구하고 필터링하면 되는 거잖아.
근데 내가 쓴 첫 코드를 보고 나서 — 이게 파이썬 맞나 싶었다.


문제 소개

학생들의 이름과 점수가 딕셔너리 리스트로 주어진다.
평균 점수를 구하고, 평균 이상인 학생들의 이름을 뽑아내는 것.

항목 내용
입력 [{"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  이터러블]
[표현식  for  변수  in  이터러블  if  조건]
for문 + 조건을 한 줄로 압축한 파이썬 문법

처음엔 읽기 어렵다. 근데 구조를 뜯어보면 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에서,
scoreaverage 이상인 것들만 골라서,
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문 방식
scores = []
for s in students:
    scores.append(s["score"])

total = 0
for s in scores:
    total += s
avg = total / len(scores)

result = []
for s in students:
    if s["score"] >= avg:
        result.append(
            s["name"])
AFTER — 컴프리헨션
scores = [
    s["score"]
    for s in students
]

avg = (
    sum(scores)
    / len(scores)
)

result = [
    s["name"]
    for s in students
    if s["score"] >= avg
]

전체 함수로 합치면 이렇다.

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

전체 흐름 한눈에 보기

점수 추출
[s["score"] for s in students]
평균 계산
sum(scores) / len(scores)
필터링
[s["name"] for s in students if s["score"] >= average]
반환
return average, above

마무리

동작하는 코드랑 파이썬다운 코드는 다르다.

for문으로 쓴 코드도 틀리지 않았다. 근데 파이썬에는 더 자연스러운 방식이 있고,
그걸 쓰면 코드가 하려는 일이 더 잘 보인다.

리스트 컴프리헨션은 줄이기 위한 문법이 아니라, 의도를 드러내기 위한 문법이다.

다음 문제로 넘어갔다.

🌿