Skip to content

15주차 · 기말 통합 문제 해결

답안 quickstart: 서술형은 어떻게 쓰나요?

Section titled “답안 quickstart: 서술형은 어떻게 쓰나요?”

기말형 문제에서는 “정답 코드”보다 코드를 읽고 구조를 설명하는 문장력이 중요합니다.

  1. 입력: 어떤 데이터가 들어오는가?
  2. 처리: 어떤 함수/반복/조건이 핵심 역할을 하는가?
  3. 검증: 어디서 실패를 잡거나 결과를 확인하는가?
  4. 출력: 최종 결과가 어디에 저장/출력되는가?
  1. try/except, if, for, return 같은 구조를 먼저 표시한다.
  2. 변수 이름만 보지 말고 데이터 흐름을 따라간다.
  3. “설명과 실제 동작이 같은가?”를 반드시 따로 확인한다.
  4. 마지막에는 왜 이 검증이 필요한지 한 문장 덧붙인다.

문제 1 · 함수 분해와 리팩토링 분석 (20점) — W9

Section titled “문제 1 · 함수 분해와 리팩토링 분석 (20점) — W9”

아래 코드를 읽고, 각 함수의 역할과 함수 간 데이터 흐름을 단계별로 설명하세요.

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문장 이상 포함하세요.

  1. parse_linevalidate_and_convert가 각각 무슨 일을 하는가?
  2. 왜 두 함수로 나눴는가? (한 함수로 합치면 어떤 문제가 있는가?)
  3. 성공 데이터와 실패 데이터가 어디에 저장되는가?

위 코드에서 assert len(raw_lines) == len(valid_rows) + len(errors) 검증을 추가한다면, 이 검증이 실패하는 상황과 의미를 3문장 이상으로 설명하세요.


문제 2 · 코드 설명과 실제 동작의 차이 찾기 (20점) — W9, W10

Section titled “문제 2 · 코드 설명과 실제 동작의 차이 찾기 (20점) — W9, W10”

아래는 코드와 학생 설명입니다. 학생 설명 중 틀린 부분을 모두 찾아 왜 틀렸는지 각각 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"]}

학생 설명:

  1. 이 함수는 문자열을 바로 출력하는 함수이다.
  2. score가 105여도 정상 통과한다.
  3. 이 함수는 딕셔너리를 반환하지 않는다.

아래 코드의 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”

아래 코드를 읽고, 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_val
filtered = arr[normal_mask]
print("원본 개수:", len(arr))
print("필터 후 개수:", len(filtered))
print("필터 후 평균:", np.mean(filtered))

답안에는 아래를 각 항목당 1-2 문장씩 포함하세요.

  1. np.abs(arr - mean_val)이 한 줄로 가능한 이유 (벡터 연산)
  2. normal_mask은 어떤 값을 가지는가? (불리언 배열)
  3. arr[normal_mask]은 어떤 원소를 골라내는가?

위 코드에서 2.10은 이상치(outlier)입니다. 이 값이 필터링되는 과정을 수치를 포함해 3-4 문장으로 추적하세요.


문제 4 · 알고리즘 패턴과 데이터 활용 (15점) — W13

Section titled “문제 4 · 알고리즘 패턴과 데이터 활용 (15점) — W13”

아래 코드의 카운팅과 정렬 패턴을 분석하세요.

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)

답안에는 아래를 포함하세요.

  1. counts.get(status, 0) + 1이 하는 일을 1-2 문장으로
  2. sort_key 함수에서 -item[1]의 의미와 정렬 방향을 1-2 문장으로
  3. 출력 결과를 예측하세요 (어떤 순서로 나오는가?)

위 코드에서 “가장 많이 발생한 상태”만 출력하려면 어떤 코드를 추가하면 되는지 2-3 문장으로 설명하세요. (sorted_counts를 활용)


문제 5 · 시각화와 결과 해석 (15점) — W12

Section titled “문제 5 · 시각화와 결과 해석 (15점) — W12”

아래 그래프 설계안을 읽고, 각 요소의 역할을 항목당 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]}
]
}
  1. 제목, x축, y축 라벨이 각각 왜 필요한가?
  2. 이 설계안만 보고 어떤 추세를 예상할 수 있는가?
  3. 라벨 없이 숫자만 있으면 왜 해석이 어려운가?

아래 문장을 더 정확한 결과 해석 문장으로 2문장으로 고쳐 쓰세요.

  • “그래프가 내려간다.”

조건: (1) 무엇이 변할 때, (2) 어떤 값이, (3) 어느 방향으로 바뀌는지를 포함하세요.


문제 6 · 통합 파이프라인 설계 (10점) — W14

Section titled “문제 6 · 통합 파이프라인 설계 (10점) — W14”

아래 미니 프로젝트의 5단계를 읽고, 각 단계가 왜 필요한지 항목당 1-2 문장씩 설명하세요.

1단계: 데이터 생성 (NumPy로 센서 측정값 시뮬레이션)
2단계: 처리 함수 (평균, 표준편차, 이상치 제거)
3단계: 검증 (예외 처리로 잘못된 값 걸러내기)
4단계: 출력 포매팅 (f-string으로 요약 테이블 생성)
5단계: 시각화 사양 (plot_spec 딕셔너리 작성)

위 파이프라인에서 3단계(검증)를 건너뛰면 4-5단계 결과에 어떤 문제가 생기는지 3-4 문장으로 설명하세요.


아래 코드를 보고, 초보자에게 설명하듯 5문장 이내로 설명하세요.

import numpy as np
scores = [88, 91, 77]
arr = np.array(scores)
result = {"count": len(arr), "avg": float(np.mean(arr))}
print(result)

아래 코드를 읽고, 함수로 분리하면 좋을 부분을 찾아 함수 이름, 매개변수, 반환값을 제안하세요.

data = [3.2, 5.1, 2.8, 4.9, 3.0]
total = 0
count = 0
for val in data:
if val > 3.0:
total += val
count += 1
if count > 0:
avg = total / count
else:
avg = 0
print("평균:", avg, "개수:", count)