# AppointmentBook free response answer 2023

`AppointmentBook` is #1 from the from the 2023 AP Computer Science A Free Response problems.

https://apcentral.collegeboard.org/media/pdf/ap23-frq-comp-sci-a.pdf

## Part (a) `findFreeBlock` method (original solution)

``````public int findFreeBlock(int period, int duration)
{
for(int startMinute = 0; startMinute <= 59; startMinute++)
{
int endMinute = startMinute + duration - 1;

if(endMinute > 59)
return -1;

boolean isFree = true;

for(int minute = startMinute; minute <= endMinute; minute++)
if( ! isMinuteFree(period, minute) )
isFree = false;

if(isFree)
return startMinute;
}

return -1;
}
``````

This could be done in a few ways.

The condition `endMinute > 59` could be incorporated into the loop. I wrote it this way because it very clearly works.

Some of the code inside the outer loop could be extracted into its own method.

## Part (a) `findFreeBlock` method (considered solution)

``````public int findFreeBlock(int period, int duration)
{
int freeInARow = 0;

for(int minute = 0; minute <= 59; minute++)
{
if(isMinuteFree(period, minute))
freeInARow++;
else
freeInARow = 0;

if(freeInARow == duration)
return minute - freeInARow + 1;
}

return -1;
}
``````

This is a one pass algorithm that keeps track of the number of consecutive free minutes. If at any point, the number of consecutive free minutes equals the requested appointment duration, the start of the current run of free minutes is calculated and returned.

When I did this problem the first time, I was aware that there was a better solution, but it was not immediately obvious. My original solution above is what I wrote under time constraints, because I knew it would work.

The start of the current run could also be stored to avoid the calculation `minute - freeInARow + 1`.

## Part (b) `makeAppointment` method

``````public boolean makeAppointment(int startPeriod, int endPeriod,
int duration)
{
for(int period = startPeriod; period <= endPeriod; period++)
{
int startMinute = findFreeBlock(period, duration);

if(startMinute != -1)
{
reserveBlock(period, startMinute, duration);
return true;
}
}

return false;
}
``````

## Java files with test code

AppointmentBook.java includes implementations of `isMinuteFree` and `reserveBlock`. OneTest.java includes JUnit 5 test code with the examples from the problem. See Running JUnit 5 tests.