시험 범위
포함 범위
| 주차 | 포함 내용 | 시험에서 묻는 방식 |
|---|---|---|
| 10주차 | 행렬과 벡터 기초 | 행렬/벡터 크기 판단, 곱셈 가능 여부, 결과 shape, 간단한 계산 |
| 11주차 | NumPy 기초 | 배열 연산, 평균/차이 계산, 불리언 mask, 필터링 결과 추적 |
| 13주차 | 실용 알고리즘 | dict.get 카운팅, sorted(..., key=...), 정렬 방향, tie-break 설명 |
| 14주차 | 통합 코드 읽기 | 데이터가 생성 → 정제 → 요약되는 흐름 설명. 단, 시각화 설계안은 제외 |
제외 범위
- 9주차 리팩토링과 테스트: 함수 분해, 테스트 설계, assert 중심 리팩토링 문제는 기말 범위에서 제외합니다.
- 12주차 데이터 시각화(matplotlib): 그래프 작성, 축 라벨,
plot_spec, matplotlib 코드는 기말 범위에서 제외합니다. - 14주차 내용 중에서도 시각화 설계안이나 그래프 해석은 제외합니다.
문제 유형과 난이도
중간고사보다 달라지는 점은 다음과 같습니다.
- 자료형보다 shape가 중요해집니다.
예:A @ x가 가능한지, 결과가 몇 행 몇 열인지 먼저 판단해야 합니다. - for 루프보다 NumPy 배열 전체 연산이 자주 나옵니다.
예:arr - arr.mean()이 각 원소에 동시에 적용되는 이유를 설명합니다. - 정렬은 “결과만”보다 “기준 함수”를 설명해야 합니다.
예:return (-count, name)이 왜 빈도 내림차순과 이름 오름차순을 동시에 표현하는지 씁니다. - 자주 하는 실수도 시험 범위 안에서 확인할 수 있습니다.
예: 여러 조건을 결합하는 방식, 음수 값의 정렬 방향, 동점 처리 기준을 혼동하지 않도록 점검하세요.
답안 작성 빠른 점검
기말 답안은 정답 숫자만 쓰면 부족합니다. 아래 4단계를 짧게라도 포함하세요.
- shape/자료구조 확인: 배열인가, 리스트인가, dict인가? 행렬 크기는 얼마인가?
- 연산 규칙 설명: 원소별 연산인가, 행렬곱인가, 카운팅인가, 정렬인가?
- 중간 결과 추적: mask, counts, sorted 결과처럼 중간 변수를 한 번 이상 확인하세요.
- 최종 해석: 왜 그 출력/결과가 나오는지 1-2문장으로 마무리하세요.
연습문제 1 · 행렬과 벡터 계산 규칙
다음 행렬과 벡터를 보고 질문에 답하세요.
A = [ 1 2 ] x = [ 10 ] [ 3 4 ] [ 20 ]질문
A의 shape와x의 shape를 쓰세요.A @ x가 가능한 이유를 안쪽 크기 관점에서 설명하세요.A @ x의 결과 shape를 쓰세요.- 각 행의 가중합을 계산해 결과 벡터를 구하세요.
힌트
- 행렬곱에서는 왼쪽 행렬의 열 수와 오른쪽 벡터의 행 수가 같아야 합니다.
- 첫 번째 결과는
1*10 + 2*20입니다.
연습문제 2 · NumPy mask와 필터링
아래 코드를 읽고, 각 변수가 어떤 값을 가지는지 추적하세요.
import numpy as np
raw = np.array([3.1, -1.0, 4.2, 5.5, 8.0])valid_mask = (raw >= 0.0) & (raw <= 6.0)clean = raw[valid_mask]shifted = clean - 3.0
print(valid_mask)print(clean)print(shifted)질문
valid_mask의 True/False 값을 순서대로 쓰세요.clean에 남는 값들을 쓰세요.shifted = clean - 3.0이 for 루프 없이 가능한 이유를 설명하세요.shifted의 값을 순서대로 쓰세요.
힌트
- 조건은 “0 이상이고 6 이하”입니다.
- NumPy 배열에서
clean - 3.0은 각 원소에 같은 연산을 적용합니다.
연습문제 3 · 카운팅과 정렬 기준
아래 코드는 상태 로그를 세고, 많이 나온 상태부터 정렬합니다.
logs = ["OK", "WARN", "OK", "ERR", "WARN", "OK"]
counts = {}for status in logs: counts[status] = counts.get(status, 0) + 1
def sort_key(item): status, count = item return (-count, status)
ordered = sorted(counts.items(), key=sort_key)print(counts)print(ordered)질문
counts.get(status, 0) + 1이 처음 보는 key와 이미 본 key에서 각각 어떻게 동작하는지 설명하세요.- 최종
counts딕셔너리를 쓰세요. sort_key의-count는 어떤 정렬 방향을 만들기 위한 것인지 설명하세요.ordered의 출력 순서를 예측하세요.
힌트
counts.items()의 원소는("OK", 3)같은 tuple입니다.(-count, status)는 먼저 count를 큰 순서로 보고, count가 같으면 상태 이름을 알파벳 순서로 봅니다.
연습문제 4 · dBm 정렬 방향
수신 전력 데이터가 다음과 같이 주어졌습니다.
channels = [ {"id": "A", "power_dbm": -55}, {"id": "B", "power_dbm": -42}, {"id": "C", "power_dbm": -61}, {"id": "D", "power_dbm": -42},]
def power_key(row): return (-row["power_dbm"], row["id"])
ordered = sorted(channels, key=power_key)print([row["id"] for row in ordered])질문
- dBm 값에서
-42 dBm과-61 dBm중 어느 쪽이 더 강한 신호인지 쓰세요. -row["power_dbm"]를 key로 쓰면 왜 강한 신호가 앞쪽에 오는지 설명하세요.B와D는 전력이 같을 때 어떤 기준으로 순서가 정해지는지 설명하세요.- 최종 출력되는 채널 ID 순서를 쓰세요.
힌트
- RSSI/dBm은 숫자가 클수록, 즉 덜 음수일수록 강한 신호입니다.
- tuple key는 첫 번째 기준이 같으면 두 번째 기준을 봅니다.
10주차 · 행렬과 벡터 행렬/벡터 shape와 계산 규칙 복습
11주차 · NumPy 기초 배열, mask, 벡터 연산 복습
13주차 · 알고리즘 패턴 카운팅, 정렬, 탐색 패턴 복습
실습 콘솔 학생용 빈 Python 콘솔에서 자유롭게 실습하기
