문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음
선생님이 학생들에게 책을 펼치라고 했다. 학생은 첫 페이지나 마지막 페이지부터 한장씩 넘길 수 있다. 책의 1페이지는 항상 오른쪽부터 시작한다.
1페이지를 넘기면 2페이지와 3페이지가 있다. 책은 항상 앞뒤 양면 인쇄가 된다. 책이 총 n 페이지이고 학생이 p 페이지를 찾고 싶을 때, 책을 최소로 넘기는데 필요한 최소 장 수는 얼마일까? 책을 넘길때 처음이나 끝에서 시작할 수 있다.
n = 5
p = 3
만약 학생이 3페이지를 펼치길 원한다면, 책을 1페이지에서 한장을 넘기면 된다. 그리고 마지막 5페이지에서 1장을 넘겨도 된다. 그러면 1을 반환한다.
pageCount 함수를 완성해라.
pageCount 함수는 아래와 같은 매개변수를 가지고 있다.
반복문을 사용하여 풀려고 했지만 p의 값에 따라 효율의 편차가 있을 것 같아서 작성하는 방법으로 풀었다.
전체 몇 장인지와 찾으려고 하는 페이지가 몇 번째 장인지 구한다.
int all = n / 2; // 전체 장수
int page = p / 2; // 페이지 장수
문제에서 책의 페이지를 보면 [0, 1], [2, 3], [4, 5]처럼 구성되어있다. 따라서 Inter로 2와 3을 2로 나누면 몫이 1이 나오므로 몇 장을 넘겨야 하는지 알기 쉬워진다.
이제 몇 장을 넘겨야 하는지 구한다.
if(all / 2 >= page){
return page;
}else{
return all - page;
}
최소값을 구해야하기 때문에 중간 값을 기준으로 앞 또는 뒤에서 시작할지 정할 수 있다. page가 중간 값보다 작거나 같으면 앞에서 시작하므로 page를 그대로 반환한다. 그 외 경우는 뒤에서 시작하므로 전체에서 page를 뺀 값을 반환한다.
public static int pageCount(int n, int p) {
int all = n / 2;
int page = p / 2;
if(all / 2 >= page){
return page;
}else{
return all - page;
}
}