15주차 · 기말 통합 문제 해결
답안 quickstart: 서술형은 어떻게 쓰나요?
Section titled “답안 quickstart: 서술형은 어떻게 쓰나요?”기말형 문제에서는 “정답 코드”보다 코드를 읽고 구조를 설명하는 문장력이 중요합니다.
가장 기본적인 답안 뼈대
Section titled “가장 기본적인 답안 뼈대”- 입력: 어떤 데이터가 들어오는가?
- 처리: 어떤 함수/반복/조건이 핵심 역할을 하는가?
- 검증: 어디서 실패를 잡거나 결과를 확인하는가?
- 출력: 최종 결과가 어디에 저장/출력되는가?
문항을 읽을 때 체크할 4가지
Section titled “문항을 읽을 때 체크할 4가지”if,for,return, 배열shape같은 구조와 데이터 모양을 먼저 표시한다.- 변수 이름만 보지 말고 데이터 흐름을 따라간다.
- “설명과 실제 동작이 같은가?”를 반드시 따로 확인한다.
- 마지막에는 왜 이 검증이 필요한지 한 문장 덧붙인다.
문제 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 convert_or_none(row): score_text = row["score"] if not score_text.isdigit(): return None score = int(score_text) if not (0 <= score <= 100): return None return {"id": row["id"], "score": score, "team": row["team"]}
valid_rows = []skipped_rows = []
for line in raw_lines: parsed = parse_line(line) cleaned = convert_or_none(parsed) if cleaned is None: skipped_rows.append(parsed) else: valid_rows.append(cleaned)
print(valid_rows)print(skipped_rows)답안에는 아래를 각 항목당 2문장 이상 포함하세요.
parse_line과convert_or_none이 각각 무슨 일을 하는가?- 왜 두 함수로 나눴는가? (한 함수로 합치면 어떤 문제가 있는가?)
- 성공 데이터와 건너뛴 데이터가 어디에 저장되는가?
문항 B (8점)
Section titled “문항 B (8점)”위 코드에서 assert len(raw_lines) == len(valid_rows) + len(skipped_rows) 검증을 추가한다면, 이 검증이 실패하는 상황과 의미를 3문장 이상으로 설명하세요.
문제 2 · 행렬과 벡터 계산 규칙 설명 (20점) — W10
Section titled “문제 2 · 행렬과 벡터 계산 규칙 설명 (20점) — W10”문항 A (10점)
Section titled “문항 A (10점)”아래 두 행렬을 보고 학생 설명 중 틀린 부분을 모두 찾아 왜 틀렸는지 각각 2-3문장으로 고쳐 쓰세요.
A = [ 1 2 3 ] [ 4 5 6 ] shape: 2 × 3
B = [ 10 20 ] [ 30 40 ] [ 50 60 ] shape: 3 × 2학생 설명:
A + B는 가능하다. 숫자가 둘 다 6개이기 때문이다.A @ B는 불가능하다. 두 행렬의 모양이 다르기 때문이다.A @ B의 결과가 가능하다면 결과 크기는3 × 3이다.
문항 B (10점)
Section titled “문항 B (10점)”다음 행렬-벡터 곱을 계산하는 과정을 행마다 하나의 가중합이라는 말로 설명하고, 결과 벡터를 구하세요.
A = [ 1 2 ] x = [ 10 ] [ 3 4 ] [ 20 ] [ 5 6 ]답안에는 아래를 포함하세요.
A와x의 크기- 곱이 가능한 이유
- 결과 크기
- 각 행의 계산식
문제 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 문장씩 설명하세요.
plot_spec = { "title": "전압 vs 거리", "x_label": "거리 (m)", "y_label": "수신 전압 (mV)", "chart_type": "line", "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단계: 검증 (정상 범위 mask와 shape 점검으로 잘못된 값 걸러내기)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)