📝 AP CS A FRQ 공식 채점 가이드 (정연이용 · D-13)

FRQ 공식 채점 가이드 — Q1~Q4

College Board CED V.1 Effective Fall 2025 · 25점 / 90분 / 45% · 한국 학생 빈출 감점 정리

📌 시험 정보 (Section II — Free-Response)
FRQ 4문항 / 90 minutes / 시험 비중 45% / 총점 25점 · 모두 Practice 2 (Develop Code) 평가 (Skills 2.A·2.B·2.C)
Q1: Methods and Control Structures (7 points) — Part A 4점 (iterative/conditional + class method 호출) + Part B 3점 (String 메서드 호출)
Q2: Class Design (7 points) — class header + instance variables + constructor + method 모두 작성
Q3: Data Analysis with ArrayList (5 points) — ArrayList 사용·분석·조작 1 method
Q4: 2D Array (6 points) — 2D 배열 사용·분석·조작 1 method
• 평균 시간: 4문항 × 22.5분. 시험 전체 3시간 = Section I (Multiple-Choice 42문항 / 90 minutes / 55%) + Section II (Free-Response 4문항 / 90 minutes / 45%)
계산기 사용 불가. Java Quick Reference 1장 제공 (CED p.150).
🛠️ 5 Computational Thinking Practices (CED 분류)
Section I Multiple-Choice는 Practices 1~5 모두 평가. Section II Free-Response는 Practice 2 (Develop Code)만 집중 평가.
Practice 1: Design Code — 2–10% (적합한 알고리즘 설계)
Practice 2: Develop Code — 22–38% (FRQ 4문항 모두 해당)
Practice 3: Analyze Code — 37–53% (MCQ 최다 비중, 코드 trace)
Practice 4: Document Code and Computing Systems — 10–15%
Practice 5: Use Computers Responsibly — 2–10% (윤리·사회적 영향)
① 채점 원리 — College Board가 어떻게 점수를 주는가

AP CSA FRQ 채점은 Stat의 holistic E/P/I rubric과 다릅니다. CSA는 "포인트 합산(point-by-point)" 방식입니다. 각 문항은 sub-task별로 1점씩 분리 채점되고, 25점 만점이 그대로 누적됩니다.

CSA FRQ 채점 단계

단계판정 기준의미
Earned (점수 획득)해당 sub-task의 코드가 지정된 동작을 정확히 수행하고 syntax도 통과1점씩 누적. 부분 점수 사냥이 가능
Not Earned코드가 컴파일 안 됨 / 잘못된 동작 / 빠짐해당 sub-task 0점. 다른 sub-task는 영향 없음
Consistent with앞 sub-task에서 틀린 변수·return 값이 있어도, 그 잘못된 값에 일관되게 반응한 코드는 점수 인정한 줄 실수가 전체를 망가뜨리지 않도록 College Board가 보호
✅ 핵심 통찰 — 한국 학생용
CSA는 "전부 맞히지 않아도 부분점수가 살아남는다". 막혀도 멈추지 말고 method header + return 문이라도 적어 두면 1점씩 챙길 수 있습니다. compile 안 되는 답안에는 점수가 거의 없다는 점도 기억.

Computational Thinking Practice 2 — Develop Code

Skill이름FRQ 평가 위치
Skill 2.AWrite program code to create objects of a class and call methods.Q1 Part A·B / Q2 / Q3 / Q4 — class·method·constructor 호출
Skill 2.BWrite program code to define new types by creating classes.Q2 primary focus (Class Design)
Skill 2.CWrite program code to satisfy method specifications using expressions, conditional statements, and iterative statements.Q1·Q3·Q4 primary focus (메서드 본문 구현)

4 Units of Instruction (CED V.1)

📌 Common Errors (College Board 공개)
매년 Chief Reader Report에 "Common Errors"가 공개됩니다. CSA 빈출은 return 누락, ==로 String 비교, ArrayList traversal 중 remove, 2D 배열 row/col 혼동, private로 시작 안 해 컴파일 실패 등. 이 가이드 ⑦번 섹션에 한국 학생 기준 Top 10으로 정리했습니다.
Q1 — Methods and Control Structures (Skill 2.A·2.B·2.C, 7점)
📌 Q1 정체 (CED p.146 원문)
"Students will write two methods or one constructor and one method of a given class based on provided specifications and examples. In Part A (4 points), the method or constructor will require students to write iterative or conditional statements, or both, as well as statements that call methods in the specified class. In Part B (3 points), the method or constructor will require calling String methods."
예시 — Username 생성기 시나리오 (CED 스타일)

한 SNS 사이트가 새 사용자 username을 자동 생성한다. UsernameGenerator 클래스는 사용자 이름과 시도 번호를 받아 username을 만들고, 중복이면 번호를 1씩 올린다.

  • Part A (4점) — generate 메서드: 1부터 maxAttempts까지 반복하며 isAvailable(String) 메서드를 호출해 사용 가능한 username을 찾고, 발견되면 그 username을 반환한다. 끝까지 못 찾으면 "unavailable"을 반환.
  • Part B (3점) — buildUsername(String name, int n): name첫 3글자(소문자) + n을 이어붙인 String을 반환. 만약 name 길이가 3 미만이면 name 전체를 사용.

📋 채점 분배 (Part A — 4점)

1
method header 정확: public String generate(int maxAttempts) — return type / 접근제어자 / 매개변수 일치 Implement2.C
1
iterative statement: 1부터 maxAttempts까지 도는 for 또는 while 루프. 경계 정확 (i <= maxAttempts). Implement2.C
1
class method 호출 + conditional: isAvailable(...) 호출 결과를 if로 분기. 호출에 적절한 String 인자를 전달. Implement2.A
1
두 가지 return 모두 정확: 발견 시 그 username return, 끝까지 못 찾으면 "unavailable" return. 둘 중 하나만 맞으면 0점 (단일 sub-task). Implement2.C

📋 채점 분배 (Part B — 3점)

1
method header + return type: public String buildUsername(String name, int n) Implement2.C
1
String 메서드 정확 호출: name.substring(0, 3) 또는 name.length()로 길이 체크 후 substring. toLowerCase() 적용. Implement2.A
1
concatenation + return: 잘라낸 prefix와 n을 String으로 이어붙여 반환. +가 String이면 자동 변환되는 점 활용. Implement2.C
총점 7점 (Part A 4 + Part B 3)
💡 Q1에서 배울 점
  • Part A는 iterative + conditional + 클래스 내 메서드 호출 3박자가 핵심. 한 가지라도 빠지면 1점씩 깎임
  • Part B의 String 메서드는 CED Java Quick Reference에 명시된 것만 사용: length, substring, indexOf, equals, compareTo. (charAt도 자주 등장)
  • substring(a, b)b를 포함하지 않음 — off-by-one 빈출
  • String 비교는 반드시 .equals(). ==는 참조 비교라 false 자주 반환
⚠️ Q1 빈출 감점 (한국 학생)
  • return 누락 → "compile error: missing return statement" → 즉시 0점 (전체 method)
  • public 누락 → method header 점수 0점
  • 세미콜론(;) 누락 → compile 실패 시 그 줄에 묶인 sub-task 0점
  • String 비교에 == → 의도와 다른 결과 → return 값 점수 못 받음
  • 변수명 오타 (case sensitive) → undefined identifier → compile 실패
  • loop 경계 off-by-one: i < maxAttempts로 쓰면 마지막 시도 누락 (최소 1점 손실)
Q2 — Class Design (Skill 2.B, 7점)
📌 Q2 정체 (CED p.146 원문)
"Students will be instructed to design and implement a class based on provided specifications and examples. … The class must include a class header, instance variables, a constructor, a method, and implementation of the constructor and required method."
예시 — CupcakeMachine 클래스 (CED Course Overview Sample)

The CupcakeMachine class represents a cupcake vending machine. Constructor에 int (보유 컵케익 수, ≥0)와 double (개당 가격 dollar, >0.0) 두 매개변수를 받는다.

takeOrder(int n): 주문 수량 n (양의 정수)을 받아 처리한다.

  • 충분한 컵케익이 있으면 주문번호와 비용 문자열을 반환 (예: "Order number 1, cost $3.5")하고, 보유 수량을 차감하며 주문번호를 1씩 증가
  • 부족하면 "Order cannot be filled" 반환. 수량과 주문번호 모두 변경되지 않음

예시: c1 = new CupcakeMachine(10, 1.75) 생성 → c1.takeOrder(2)"Order number 1, cost $3.5"c1.takeOrder(3)"Order number 2, cost $5.25"c1.takeOrder(10)"Order cannot be filled"c1.takeOrder(1)"Order number 3, cost $1.75"

📋 채점 분배 (7점)

1
class header: public class CupcakeMachine — 접근제어자 + class 키워드 + 정확한 이름 Implement2.B
1
적절한 instance variables 선언: private int cupcakes;, private double cost;, private int orderCount;private로 선언 (encapsulation), 타입 정확 Implement2.B
1
constructor 시그니처 정확: public CupcakeMachine(int c, double p) — 클래스 이름과 정확히 일치, 매개변수 타입 순서 일치 Implement2.B
1
constructor 본문: 매개변수를 instance variable에 정확히 복사 (this.cupcakes = c; 등). orderCount를 0으로 초기화 Implement2.B
1
takeOrder method header 정확: public String takeOrder(int n) Implement2.C
1
충분 case 처리: if (n <= cupcakes)orderCount 증가, cupcakes -= n, return 문자열 (주문번호 + cost) 정확 Implement2.C
1
부족 case 처리: else에서 "Order cannot be filled" 반환. state 변경 없음 (cupcakes·orderCount 그대로) Implement2.C
총점 7점
💡 Q2에서 배울 점
  • encapsulation — instance var는 무조건 private. public으로 선언하면 1점 깎임
  • Constructor는 매개변수를 모두 instance var에 저장하는 게 기본. 하나라도 빠지면 0점
  • state-changing method: 충분 case에서 cupcakes -= n, orderCount++ 누락 시 다음 호출에서 잘못된 결과 → 큰 감점
  • Return 문자열 포맷은 예시 출력과 정확히 일치해야 함. "Order number "의 공백·쉼표·달러 기호 모두 syntax-sensitive
⚠️ Q2 빈출 감점 (한국 학생)
  • instance var public 선언 → encapsulation 점수 0점
  • constructor 이름 오기 (cupcakeMachine 소문자, CupcakeMaker 등) → 컴파일 실패, 1점 손실 + 다른 점수도 위험
  • constructor 매개변수 → instance var 대입 누락 → 다음 메서드 동작 망가짐 → 도미노 감점
  • takeOrder가 void로 선언됨 → return 못함 → 5~6점 손실
  • state 변경 누락 (충분 case에서 cupcakes 차감 안 함) → 두 번째 주문부터 잘못된 결과
  • "return" 문자열 포맷 mismatch ("Order #1" vs "Order number 1") → return 점수 0점
Q3 — Data Analysis with ArrayList (Skill 2.C, 5점)
📌 Q3 정체 (CED p.146 원문)
"Students will write one method of a given class based on provided specifications and examples. The method requires students to use, analyze, and manipulate data in an ArrayList structure."
예시 — 학생 점수 ArrayList 처리

한 클래스가 학생 점수 목록을 ArrayList<Integer> scores로 저장한다. 메서드 removeBelow(int threshold)를 작성하라:

  • scores에서 threshold 미만인 모든 점수를 제거
  • 제거된 항목 수를 int로 반환
  • 예: scores = [85, 60, 92, 45, 70], threshold = 65scores[85, 92, 70]이 되고 2 반환

📋 채점 분배 (5점)

1
method header: public int removeBelow(int threshold) — return type / 매개변수 정확 Implement2.C
1
ArrayList traversal 정확: for (int i = scores.size() - 1; i >= 0; i--) 또는 인덱스 0부터 순회 후 보정. 제거 시에는 뒤에서 앞으로 또는 같은 인덱스 재방문 패턴이 안전. Implement2.C
1
ArrayList 메서드 정확 호출: scores.get(i)로 값 읽기, scores.remove(i)로 제거, scores.size()로 길이. (배열 .length 절대 X) Implement2.A
1
조건 정확: if (scores.get(i) < threshold)<=로 잘못 쓰면 경계값(=threshold) 처리 오류. 자동언박싱 활용. Implement2.C
1
정확한 return 값: 제거 횟수를 카운트하는 count 변수 또는 (originalSize - scores.size()). 메서드 끝에 return count; Implement2.C
총점 5점
💡 Q3에서 배울 점
  • ArrayList 제거 패턴은 뒤에서 앞으로가 가장 안전. 인덱스 shift 걱정 없음
  • ArrayList.size() ↔ 배열 .length ↔ String .length()3가지 모두 다름
  • scores.get(i)로 값 읽기 (대괄호 scores[i]는 ArrayList 문법 아님)
  • Integer 자동언박싱 (scores.get(i) < threshold는 자동으로 int 비교)
⚠️ Q3 빈출 감점 (한국 학생)
  • ConcurrentModificationException — for-each 안에서 remove 호출 → traversal·remove 점수 모두 0점
  • 인덱스 ↔ 값 혼동if (i < threshold)로 잘못 씀 (scores.get(i) 빠짐)
  • .size() vs .length 혼동scores.length는 컴파일 에러
  • .get(i) vs [i] 혼동 — 대괄호는 컴파일 에러
  • 제거 후 i++를 그대로 실행 — 다음 항목 건너뜀 (off-by-one)
  • return type을 void로 선언 → header 점수 + return 점수 모두 0점
Q4 — 2D Array (Skill 2.C, 6점)
📌 Q4 정체 (CED p.146 원문)
"Students will write one method of a given class based on provided specifications and examples. The method requires students to use, analyze, and manipulate data in a 2D array structure."
예시 — 좌석 배치 행렬 분석

한 영화관의 좌석 점유를 int[][] seats로 저장한다 (0 = 비어 있음, 1 = 점유). seats는 직사각형이라 가정 (각 row 길이 동일). 메서드 countFullRows()를 작성하라:

  • 모든 좌석이 점유된 row (전부 1)의 개수를 반환
  • 예: seats = {{1,1,1}, {1,0,1}, {1,1,1}}2 반환 (row 0과 row 2)

📋 채점 분배 (6점)

1
method header: public int countFullRows() — return type / 매개변수 없음 / 정확한 이름 Implement2.C
1
outer loop (row 순회): for (int r = 0; r < seats.length; r++) — row 개수는 seats.length (대괄호 없음) Implement2.C
1
inner loop (col 순회): for (int c = 0; c < seats[r].length; c++) — column 개수는 seats[r].length Implement2.C
1
인덱스 정확 + 원소 접근: seats[r][c] — row 먼저, col 나중. seats[c][r]로 뒤집으면 ArrayIndexOutOfBoundsException 위험 Implement2.A
1
조건 + 누적 로직 정확: 한 row가 전부 1인지 판단 (flag 변수 또는 inner loop 내 break/continue). 조건 만족 시 카운터 증가 Implement2.C
1
정확한 return: return count; 메서드 마지막. 카운터 변수가 모든 경로에서 초기화돼야 함 Implement2.C
총점 6점
💡 Q4에서 배울 점
  • row-major traversal: 바깥 loop = row, 안쪽 loop = col. 인덱스도 arr[row][col] 순서
  • 경계 표기 정확: arr.length = row 수, arr[r].length = col 수. arr[r].length()는 String 문법 (X)
  • "각 row가 ___을 만족하는지"는 flag 변수 + break가 가독성·점수 모두 유리
  • 2D 배열도 일반 배열처럼 .length 사용 (ArrayList의 .size()와 다름)
⚠️ Q4 빈출 감점 (한국 학생)
  • row/col 인덱스 혼동seats[c][r]로 뒤집어 ArrayIndexOutOfBoundsException
  • arr[i][j].length 사용 — 원소가 int면 .length 없음 → 컴파일 에러
  • arr.length vs arr[r].length 혼동 — row 수와 col 수 표기 헷갈림
  • ArrayIndexOutOfBoundsExceptioni <= seats.length로 잘못 씀 (<이어야 함)
  • flag 변수 매 row마다 reset 안 함 — 외부에 한 번만 선언 시 다음 row에서 잘못 판정
  • 모든 inner loop가 끝나기 전 return — 첫 row만 검사하고 종료 → 큰 감점
⑥ ⏰ 권장 시간 분배 (90분)
구간시간점수전략
Q1 Methods + Control Structures22분7점/25점Part A 12분 (loop + if + return) + Part B 10분 (String 메서드 정확 호출)
Q2 Class Design25분7점/25점가장 분량 큼. class header → instance var → constructor → method 순서로 작성
Q3 ArrayList18분5점/25점traversal 패턴 결정 → get/remove 안전 호출 → return 카운트
Q4 2D Array22분6점/25점이중 loop 골격부터 → flag 변수 → return. row/col 인덱스 헷갈림 주의
여유 / 검토3분compile 가능한지 한 번 더 훑기 (괄호 / 세미콜론 / return)
합계90분25점 / 45%4문항 × 22.5분이지만 분량 큰 Q2·Q4에 더 배분
📌 시험장에서의 페이싱 룰
  • 한 sub-task에 8분 이상 매달리지 말 것. 막히면 method header + return 만 적고 다음으로
  • 한 문항에 25분 초과 시 강제로 다음 문항으로 넘어가기 (Q2 제외)
  • compile 가능한 코드가 최우선. 정답 흉내 X, 컴파일 통과 O
  • 풀이 순서 자유: Q3 ArrayList가 가장 짧으니 Q3부터 풀고 자신감 충전도 옵션
  • 완벽 답안 X → 모든 문항에 method header + return 1줄이라도 적기 = 부분점수 확보
⚠️ 시간 함정
  • Q1 Part B에서 substring·indexOf 헷갈려 시간 끌면 Q2~Q4 박살
  • Q2 instance var 5개·6개 선언하느라 시간 낭비 → 시나리오에 명시된 것만
  • Q3 enhanced for로 시도했다가 ConcurrentModificationException 알아채고 전부 다시 → 처음부터 인덱스 loop
  • Q4 매 inner loop마다 새 instance var 선언하느라 코드 복잡 → flag 변수 1개로 단순화
⑦ 🥇 Top 10 빈출 감점 패턴 (전 Q 공통, 정연이용 골든 리스트)

College Board Chief Reader Report와 한국 학생 빈출 실수를 종합한 Top 10입니다. 시험 직전 5분에 머리에 박아두세요.

#실수 패턴잘못된 예맞는 예주로 나오는 곳
1 return 누락 public int sum() { ... // return 없음 } return total; 반드시 메서드 끝에 전 Q (특히 Q1·Q3·Q4)
2 public/private 누락 class CupcakeMachine / int cupcakes; public class CupcakeMachine / private int cupcakes; Q2 class header + instance var
3 String 비교에 == if (name == "Jeongyeon") if (name.equals("Jeongyeon")) Q1 Part B, Q2 method 본문
4 base case 누락 (재귀) 재귀 호출만 있고 종료 조건 없음 → StackOverflowError if (n <= 0) return 0; 같은 base case 드물지만 Q1·Q3에서 재귀 시
5 off-by-one error for (i = 0; i <= arr.length; i++) for (i = 0; i < arr.length; i++) Q1 loop, Q3 traversal, Q4 2D loop
6 ConcurrentModificationException for (int s : list) { list.remove(s); } 인덱스 loop + 뒤에서 앞으로 (또는 보정) Q3 ArrayList 제거
7 NullPointerException str.length() 한데 str이 null if (str != null && str.length() > 0) Q1 Part B, Q2 method
8 ArrayIndexOutOfBoundsException arr[arr.length] 또는 arr[i+1] 경계 미체크 i < arr.length - 1로 안전 보장 Q4 2D 배열, Q3 인덱스
9 constructor 이름 mismatch class는 CupcakeMachine인데 constructor는 cupcakeMachine class 이름과 constructor 이름 case sensitive 100% 일치 Q2 Class Design
10 instance vs static 접근 오류 static 메서드 안에서 instance var 직접 접근 instance method로 선언, 또는 객체 통해 접근 Q1·Q2
📌 정연이 핵심 5선
Top 10 중 정연이가 가장 자주 놓치는 5개를 시험 직전 머리에 새기세요:
  1. return 누락 — 메서드가 void 아니면 모든 경로에서 return 보장
  2. == vs .equals() — String은 무조건 .equals()
  3. off-by-one<= vs < 한 글자 차이로 1~2점
  4. ConcurrentModificationException — for-each 안에서 remove 절대 X
  5. private 누락 — Q2 instance var는 무조건 private
⑧ 📋 시험 직전 1분 정독 카드 (CSA 버전)

📋 FRQ 답안 작성 직전 마지막 체크리스트

  1. Top 10 빈출 감점 (위 ⑦번) — 5개라도 머리에 박기
  2. Method 작성 4단계: ① header (public + return type + 이름 + 매개변수) ② 변수 선언 / 초기화 ③ loop / conditional 본문 ④ return
  3. Class Design 5요소 (Q2): class header → instance var (private) → constructor → method header → method 본문
  4. String 메서드 4종: length(), substring(a, b), indexOf(s), equals(s) — Q1 Part B 핵심
  5. ArrayList 메서드 5종: .size(), .get(i), .set(i, v), .add(v), .remove(i) — Q3 핵심
  6. 2D 배열 표기: arr.length (row 수) / arr[r].length (col 수) / arr[r][c] (원소) — Q4 핵심
  7. 마인드셋: 완벽 X, 모든 문항에 method header + return 1줄이라도 = 부분점수
  8. 시간 분배: Q1 22분 / Q2 25분 / Q3 18분 / Q4 22분 + 검토 3분
  9. 계산기 사용 불가 — 모든 산술은 손으로. 단, 이 시험은 산술이 거의 없어 부담 적음

🎯 시험장 첫 5분 루틴

  1. 4문항 표지를 빠르게 훑어 난이도 가늠: 익숙한 시나리오부터 풀지, Q1부터 풀지 결정
  2. 각 문항의 Task verbs 동그라미: Implement / Write / Complete / Assume
  3. 예시 입력·출력 표를 보고 edge case 메모 (음수 / 빈 배열 / 길이 1 등)
  4. 곧장 method header부터 작성 — 막히면 본문 비워두고 다음 문항

🔗 같이 보면 좋은 자료

AP CSA FRQ Scoring Guide · 2026-05-02 · CED V.1 · 정연이용 (D-13)
출처: College Board AP Computer Science A Course and Exam Description (Effective Fall 2025) · Exam Information V.1
Section II 구조 p.146 · Task Verbs p.147 · Sample MCQ p.148~ · Sample FRQ Class Design (CupcakeMachine) Course Overview p.105~127
Java Quick Reference p.150 · Computational Thinking Practices Skills 2.A·2.B·2.C