짧은 세션으로 Phase 1 마무리 복습. 그동안 배운 딕셔너리, set, 정렬, 함수 작성을 골고루 점검하고, 주말부터 Phase 2 전환을 준비한다.
학생 점수 딕셔너리에서 평균 이상인 학생 이름만 리스트로 반환하는 문제.
def above_average(scores):
avg = sum(scores.values()) / len(scores)
result = [name for name, score in scores.items() if score >= avg]
return result
.items()로 name, score 언패킹 → 조건에 맞는 name만 리스트에 담는 패턴. 딕셔너리 컴프리헨션과 조건 필터링의 조합 문제.
✅ 1차 정답
여러 리스트에서 공통 원소만 반환해야 하는데, |(합집합)을 쓰고 있어서 모든 원소가 다 나오는 버그.
# 버그
result = result | set(lst) # 합집합 → 하나라도 있으면 포함
# 수정
result = result & set(lst) # 교집합 → 모든 리스트에 있어야 포함
| 연산자 | 메서드 | 의미 |
|---|---|---|
\| | .union() | 합집합 |
& | .intersection() | 교집합 |
- | .difference() | 차집합 |
^ | .symmetric_difference() | 대칭 차집합 |
✅ 1차 정답 — 원인까지 정확히 설명
문자열 리스트를 길이 내림차순 + 같으면 사전순 오름차순으로 정렬하는 함수.
def sort_by_length(words):
return sorted(words, key=lambda x: (-len(x), x))
9차 종합 테스트에서 배운 다중 정렬 key 튜플 패턴을 완벽하게 활용. -len(x)로 내림차순, x로 오름차순을 하나의 lambda에서 처리.
✅ 1차 정답
리스트에서 중복을 제거하되 원래 순서를 유지하는 문제. 빈 set()으로 시작해서 add()로 이미 본 원소를 추적한다.
def remove_duplicates(lst):
seen = set()
result = []
for item in lst:
if item not in seen:
seen.add(item)
result.append(item)
return result
이전에 set() vs set(items) 초기값 혼동이 있었는데, 이번에는 빈 set으로 정확히 시작. set의 in 검사가 O(1)이라 효율적이다.
✅ 1차 정답
딕셔너리에서 value가 가장 큰 key를 찾는 함수인데, max_val = 0으로 초기화해서 음수만 있는 경우 조건을 만족하는 값이 없어 None이 반환되는 버그.
# 버그
max_val = 0 # 모든 value가 음수면 업데이트 안 됨
# 수정
max_val = list(d.values())[0] # 실제 데이터의 첫 값으로 초기화
다른 방법으로 float('-inf')(음의 무한대)도 가능. 어떤 숫자와 비교해도 항상 더 작기 때문에, 첫 번째 비교에서 무조건 업데이트가 된다.
float('-inf') < -99999999 # True — 어떤 수보다도 작음
max_val = float('-inf') # 최대값 초기값으로 사용
min_val = float('inf') # 반대로 최소값 찾을 때는 양의 무한대
| 방법 | 장점 | 단점 |
|---|---|---|
float('-inf') | 빈 딕셔너리여도 에러 안 남 | 외워야 함 |
list(d.values())[0] | 직관적 | 빈 딕셔너리면 IndexError |
초기값을 0이나 빈 값으로 두면 음수/특수 케이스에서 실패할 수 있다는 점을 기억하자.
✅ 1차 정답
문자열에서 각 문자의 등장 횟수를 횟수 내림차순으로 정렬된 딕셔너리로 반환하는 문제.
수업 중 질문: "Counter를 import해서 써도 되나?"
→ COS Pro 시험에서collections모듈 사용 가능. 실전에서는Counter를 쓰는 게 효율적.
풀이 1 — Counter 사용:
from collections import Counter
def char_count(s):
tmp_dict = Counter(s)
tmp_list = sorted(tmp_dict.items(), key=lambda x: -x[1])
return dict(tmp_list)
풀이 2 — Counter 없이 dict.get() 활용:
def char_count(s):
tmp_dict = {}
for w in s:
tmp_dict[w] = tmp_dict.get(w, 0) + 1
return dict(sorted(tmp_dict.items(), key=lambda x: -x[1]))
두 가지 방식 모두 작성할 수 있으면 실전에서 유연하게 대응 가능.
✅ 1차 정답 — 두 가지 풀이 모두 자발적으로 작성