2019 AP FRQ Solutions

Like many AP Computer Science teachers I was watching the College Board website yesterday for the release of the free response questions from this year. Since I know that today I’ll have students asking about the questions I come up with my own solutions so we can talk.

These are the solutions that I came up with yesterday evening. I haven’t actually run anything, so I’m not sure that they’re 9/9 solutions. But they should be pretty close. Sometime over the next few days I’ll also put together write ups with explanations of the solutions.

APCalendar

// Part A
public static int numberOfLeapYears(int year1, int year2) {
	int cnt = 0;
	for (int y=year1; y<=year2; y++) {
		if (isLeapYear(y))
			cnt++;
	}
	return cnt; 
}

// Part B
public static int dayOfWeek(int month, int day, int year) {
	int firstDay = firstDayOfYear(year);
	int doy = dayOfYear(month, day, year);
	return (firstDay + dayOfYear - 1) % 7;
}

StepTracker

public class StepTracker {
	private int days;
	private int activeDays;
	private int totalSteps;
	private int minActive;
	
	public StepTracker(int m) {
		minActive = m;
		days = 0;
		activeDays = 0;
		totalSteps = 0; 
	}
	
	public void addDailySteps(int steps) {
		days++;
		totalSteps += steps;
		if (steps >= minActive) {
			activeDays++;
		}
	}
	
	public int activeDays() {
		return activeDays; 
	}
	
	public double averageSteps() {
		if (days == 0) {
			return 0.0; 
		}
		return (double)totalSteps / days; 
	}
}

Delimiter

// Part A
public ArrayList<String> getDelimitersList(String[] tokens) {
	ArrayList<String> out = new ArrayList<>();
	for (String t: tokens) {
		if (t.equals(openDel) || t.equals(closeDel))
			out.add(t); 
	}
	return out; 
}

// Part B
public boolean isBalanced(ArrayList<String> delimiters) {
	int open = 0;
	int close = 0;
	for (String d: delimiters) {
		if (d.equals(openDel))
			open++;
		else if (d.equals(closeDel))
			close++;
		
		if (close > open)
			return false;
	}
	return open == close; 
}

Lightboard

// Part A
public LightBoard(int numRows, int numCols) {
	lights = new boolean[numRows][numCols];
	for (int r=0; r<numRows; r++)
		for (int c=0; c<numCols; c++)
			lights[r][c] = Math.random() < 0.4; 
}

// Part B
public boolean evaluateLight(int row, int col) {
	int onInCol = 0;
	for (int r=0; r<lights.length; r++)
		if (lights[r][col])
			onInCol++;
	if (lights[row][col] && onInCol % 2 == 0)
		return false;
	else if (!lights[row][col] && onInCol % 3 == 0)
		return true;
	return lights[row][col];
}

Leave a Reply

Your email address will not be published. Required fields are marked *