[HackerRank] Drawing Book

아르당·2023년 10월 30일
0

HackerRank

목록 보기
4/109
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

문제

선생님이 학생들에게 책을 펼치라고 했다. 학생은 첫 페이지나 마지막 페이지부터 한장씩 넘길 수 있다. 책의 1페이지는 항상 오른쪽부터 시작한다.
1페이지를 넘기면 2페이지와 3페이지가 있다. 책은 항상 앞뒤 양면 인쇄가 된다. 책이 총 n 페이지이고 학생이 p 페이지를 찾고 싶을 때, 책을 최소로 넘기는데 필요한 최소 장 수는 얼마일까? 책을 넘길때 처음이나 끝에서 시작할 수 있다.

Example

n = 5
p = 3

만약 학생이 3페이지를 펼치길 원한다면, 책을 1페이지에서 한장을 넘기면 된다. 그리고 마지막 5페이지에서 1장을 넘겨도 된다. 그러면 1을 반환한다.

Function Description

pageCount 함수를 완성해라.
pageCount 함수는 아래와 같은 매개변수를 가지고 있다.

  • int n: 책 전체 페이지 수
  • int p: 펼쳐야 하는 페이지

Constraints

  • 1 <= n <= 10^5
  • 1 <= p <= n

풀이

반복문을 사용하여 풀려고 했지만 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;
	}
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글