20260327 오늘의 학습: Phase 1 종합 복습

Yesol Lee·2026년 3월 27일

COS Python

목록 보기
10/30

어제 학습 요약

  • Phase 1 종합 복습 테스트 10문제 풀이 (1차 정답률 60%)
  • dict+key 패턴, 다중 정렬, 달팽이 수열 등 약점 확인
  • Phase 2 전환 전 보충 학습 필요로 판단

오늘 수업 계획

짧은 세션으로 Phase 1 마무리 복습. 그동안 배운 딕셔너리, set, 정렬, 함수 작성을 골고루 점검하고, 주말부터 Phase 2 전환을 준비한다.


학습 내용 정리

문제 1 (빈칸) — 딕셔너리 + 리스트 컴프리헨션 필터링

학생 점수 딕셔너리에서 평균 이상인 학생 이름만 리스트로 반환하는 문제.

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차 정답

문제 2 (디버깅) — set 합집합/교집합 연산

여러 리스트에서 공통 원소만 반환해야 하는데, |(합집합)을 쓰고 있어서 모든 원소가 다 나오는 버그.

# 버그
result = result | set(lst)    # 합집합 → 하나라도 있으면 포함

# 수정
result = result & set(lst)    # 교집합 → 모든 리스트에 있어야 포함
연산자메서드의미
\|.union()합집합
&.intersection()교집합
-.difference()차집합
^.symmetric_difference()대칭 차집합

✅ 1차 정답 — 원인까지 정확히 설명

문제 3 (함수 작성) — 다중 조건 정렬

문자열 리스트를 길이 내림차순 + 같으면 사전순 오름차순으로 정렬하는 함수.

def sort_by_length(words):
    return sorted(words, key=lambda x: (-len(x), x))

9차 종합 테스트에서 배운 다중 정렬 key 튜플 패턴을 완벽하게 활용. -len(x)로 내림차순, x로 오름차순을 하나의 lambda에서 처리.

✅ 1차 정답

문제 4 (빈칸) — set 순서 유지 중복 제거

리스트에서 중복을 제거하되 원래 순서를 유지하는 문제. 빈 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차 정답

문제 5 (디버깅) — 초기값 설정 함정

딕셔너리에서 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차 정답

문제 6 (함수 작성) — 문자 빈도 카운팅 + 정렬

문자열에서 각 문자의 등장 횟수를 횟수 내림차순으로 정렬된 딕셔너리로 반환하는 문제.

수업 중 질문: "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차 정답 — 두 가지 풀이 모두 자발적으로 작성


오늘의 결과

  • 6문제 전부 1차 정답, 정답률 100% — Phase 1 기초 완전히 정착
  • 이전 약점이었던 set 초기값, 함수 작성 모두 안정적으로 해결
  • 다음 학습(주말): Phase 2 전환 — 구름EDU COS Pro 기출 1회차 시작 예정
profile
문서화를 좋아하는 개발자

0개의 댓글