15주차 · 기말 통합 문제 해결
15장. 기말 통합 문제 해결
Section titled “15장. 기말 통합 문제 해결”답안 quickstart: 서술형은 어떻게 쓰나요?
Section titled “답안 quickstart: 서술형은 어떻게 쓰나요?”기말형 문제에서는 “정답 코드”보다 코드를 읽고 구조를 설명하는 문장력이 중요합니다.
가장 기본적인 답안 뼈대
Section titled “가장 기본적인 답안 뼈대”- 입력: 어떤 데이터가 들어오는가?
- 처리: 어떤 함수/반복/조건이 핵심 역할을 하는가?
- 검증: 어디서 실패를 잡거나 결과를 확인하는가?
- 출력: 최종 결과가 어디에 저장/출력되는가?
문항을 읽을 때 체크할 4가지
Section titled “문항을 읽을 때 체크할 4가지”try/except,if,for,return같은 구조를 먼저 표시한다.- 변수 이름만 보지 말고 데이터 흐름을 따라간다.
- “설명과 실제 동작이 같은가?”를 반드시 따로 확인한다.
- 마지막에는 왜 이 검증이 필요한지 한 문장 덧붙인다.
문제 1 · 함수 분해와 리팩토링 분석 (20점) — W9
Section titled “문제 1 · 함수 분해와 리팩토링 분석 (20점) — W9”문항 A (12점)
Section titled “문항 A (12점)”아래 코드를 읽고, 각 함수의 역할과 함수 간 데이터 흐름을 단계별로 설명하세요.
raw_lines = [ "id=S01,score=88,team=A", "id=S02,score=91,team=B", "id=S03,score=oops,team=A",]
def parse_line(line): row = {} for part in line.split(","): key, value = part.split("=", 1) row[key] = value return row
def validate_and_convert(row): score = int(row["score"]) if not (0 <= score <= 100): raise ValueError("score out of range") return {"id": row["id"], "score": score, "team": row["team"]}
valid_rows = []errors = []
for line in raw_lines: try: parsed = parse_line(line) cleaned = validate_and_convert(parsed) except Exception as err: errors.append(str(err)) else: valid_rows.append(cleaned)
print(valid_rows)print(errors)답안에는 아래를 각 항목당 2문장 이상 포함하세요.
parse_line과validate_and_convert가 각각 무슨 일을 하는가?- 왜 두 함수로 나눴는가? (한 함수로 합치면 어떤 문제가 있는가?)
- 성공 데이터와 실패 데이터가 어디에 저장되는가?
문항 B (8점)
Section titled “문항 B (8점)”위 코드에서 assert len(raw_lines) == len(valid_rows) + len(errors) 검증을 추가한다면, 이 검증이 실패하는 상황과 의미를 3문장 이상으로 설명하세요.
문제 2 · 코드 설명과 실제 동작의 차이 찾기 (20점) — W9, W10
Section titled “문제 2 · 코드 설명과 실제 동작의 차이 찾기 (20점) — W9, W10”문항 A (10점)
Section titled “문항 A (10점)”아래는 코드와 학생 설명입니다. 학생 설명 중 틀린 부분을 모두 찾아 왜 틀렸는지 각각 2-3 문장으로 고쳐 쓰세요.
def validate_and_convert(row): score = int(row["score"]) if not (0 <= score <= 100): raise ValueError("score out of range") return {"id": row["id"], "score": score, "team": row["team"]}학생 설명:
- 이 함수는 문자열을 바로 출력하는 함수이다.
score가 105여도 정상 통과한다.- 이 함수는 딕셔너리를 반환하지 않는다.
문항 B (10점)
Section titled “문항 B (10점)”아래 코드의 try/except/else 구조에서 각 블록이 실행되는 조건을 2-3 문장씩 설명하세요.
for line in raw_lines: try: parsed = parse_line(line) cleaned = validate_and_convert(parsed) except Exception as err: errors.append(str(err)) else: valid_rows.append(cleaned)문제 3 · NumPy 배열과 벡터 연산 (20점) — W11
Section titled “문제 3 · NumPy 배열과 벡터 연산 (20점) — W11”문항 A (12점)
Section titled “문항 A (12점)”아래 코드를 읽고, NumPy 배열과 파이썬 기본 리스트의 차이를 3문장 이상으로 설명하세요.
import numpy as np
measurements = [3.31, 3.28, 3.30, 3.35, 3.29, 2.10, 3.32]arr = np.array(measurements)
mean_val = np.mean(arr)std_val = np.std(arr)normal_mask = np.abs(arr - mean_val) < 2 * std_valfiltered = arr[normal_mask]
print("원본 개수:", len(arr))print("필터 후 개수:", len(filtered))print("필터 후 평균:", np.mean(filtered))답안에는 아래를 각 항목당 1-2 문장씩 포함하세요.
np.abs(arr - mean_val)이 한 줄로 가능한 이유 (벡터 연산)normal_mask은 어떤 값을 가지는가? (불리언 배열)arr[normal_mask]은 어떤 원소를 골라내는가?
문항 B (8점)
Section titled “문항 B (8점)”위 코드에서 2.10은 이상치(outlier)입니다. 이 값이 필터링되는 과정을 수치를 포함해 3-4 문장으로 추적하세요.
문제 4 · 알고리즘 패턴과 데이터 활용 (15점) — W13
Section titled “문제 4 · 알고리즘 패턴과 데이터 활용 (15점) — W13”문항 A (8점)
Section titled “문항 A (8점)”아래 코드의 카운팅과 정렬 패턴을 분석하세요.
logs = ["WARN", "OK", "OK", "ERR", "WARN", "OK", "ERR", "ERR"]
counts = {}for status in logs: counts[status] = counts.get(status, 0) + 1
def sort_key(item): return -item[1]
sorted_counts = sorted(counts.items(), key=sort_key)
for status, count in sorted_counts: print(status, ":", count)답안에는 아래를 포함하세요.
counts.get(status, 0) + 1이 하는 일을 1-2 문장으로sort_key함수에서-item[1]의 의미와 정렬 방향을 1-2 문장으로- 출력 결과를 예측하세요 (어떤 순서로 나오는가?)
문항 B (7점)
Section titled “문항 B (7점)”위 코드에서 “가장 많이 발생한 상태”만 출력하려면 어떤 코드를 추가하면 되는지 2-3 문장으로 설명하세요. (sorted_counts를 활용)
문제 5 · 시각화와 결과 해석 (15점) — W12
Section titled “문제 5 · 시각화와 결과 해석 (15점) — W12”문항 A (8점)
Section titled “문항 A (8점)”아래 그래프 설계안을 읽고, 각 요소의 역할을 항목당 1-2 문장씩 설명하세요.
figure_spec = { "title": "전압 vs 거리", "x_label": "거리 (m)", "y_label": "수신 전압 (mV)", "series": [ {"name": "측정값", "x": [1, 2, 3, 4, 5], "y": [320, 280, 210, 150, 95]} ]}- 제목, x축, y축 라벨이 각각 왜 필요한가?
- 이 설계안만 보고 어떤 추세를 예상할 수 있는가?
- 라벨 없이 숫자만 있으면 왜 해석이 어려운가?
문항 B (7점)
Section titled “문항 B (7점)”아래 문장을 더 정확한 결과 해석 문장으로 2문장으로 고쳐 쓰세요.
- “그래프가 내려간다.”
조건: (1) 무엇이 변할 때, (2) 어떤 값이, (3) 어느 방향으로 바뀌는지를 포함하세요.
문제 6 · 통합 파이프라인 설계 (10점) — W14
Section titled “문제 6 · 통합 파이프라인 설계 (10점) — W14”문항 A (6점)
Section titled “문항 A (6점)”아래 미니 프로젝트의 5단계를 읽고, 각 단계가 왜 필요한지 항목당 1-2 문장씩 설명하세요.
1단계: 데이터 생성 (NumPy로 센서 측정값 시뮬레이션)2단계: 처리 함수 (평균, 표준편차, 이상치 제거)3단계: 검증 (예외 처리로 잘못된 값 걸러내기)4단계: 출력 포매팅 (f-string으로 요약 테이블 생성)5단계: 시각화 사양 (plot_spec 딕셔너리 작성)문항 B (4점)
Section titled “문항 B (4점)”위 파이프라인에서 3단계(검증)를 건너뛰면 4-5단계 결과에 어떤 문제가 생기는지 3-4 문장으로 설명하세요.
추가 연습 문제 (미채점)
Section titled “추가 연습 문제 (미채점)”연습 1 · 코드 설명문 쓰기
Section titled “연습 1 · 코드 설명문 쓰기”아래 코드를 보고, 초보자에게 설명하듯 5문장 이내로 설명하세요.
import numpy as np
scores = [88, 91, 77]arr = np.array(scores)result = {"count": len(arr), "avg": float(np.mean(arr))}print(result)연습 2 · 리팩토링 판단
Section titled “연습 2 · 리팩토링 판단”아래 코드를 읽고, 함수로 분리하면 좋을 부분을 찾아 함수 이름, 매개변수, 반환값을 제안하세요.
data = [3.2, 5.1, 2.8, 4.9, 3.0]total = 0count = 0for val in data: if val > 3.0: total += val count += 1if count > 0: avg = total / countelse: avg = 0print("평균:", avg, "개수:", count)