[HackerRank] Lisa's Workbook

아르당·2023년 12월 5일
0

HackerRank

목록 보기
40/109
post-thumbnail

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

문제

리사는 막 새로운 수학 문제집을 얻었다. 문제집은 챕터로 묶어진 연습 문제를 포함하고 있다. 리사는 캡터 내에서 페이지와 문제 번호가 같다면 특별한 문제라고 믿는다. 리사의 책은 다음과 같이 구성되어있다.

  • 리사의 문제집에 1부터 n까지 챕터가 있다.
  • i번째 챕터는 1부터 arr[i]까지 문제가 있다.
  • 각 페이지는 k개의 문제를 가질 수 있다. 단 챕터의 마지막 페이지만 k개미만의 문제를 가질 수 있다.
  • 각 새로운 챕터는 새로운 페이지에서 시작하고, 페이지는 다른 챕터의 문제를 포함할 수 없다.
  • 페이지는 1부터 시작한다.

리사의 문제집의 정보가 주어질때, 스페셜 문제의 개수를 구해라.

Example

arr = [4, 2]
k = 3

리사의 문제집은 챕터 1에 arr[1] = 4, 챕터 2에 arr[2] = 2의 문제를 가지고 있다. 각 페이지는 k = 3개의 문제만 가질 수 있다.
첫 페이지는 챕터 1의 3개의 문제를 가질 것이다. 문제 1은 1 페이지에 있어서 스페셜 문제이다. 2 페이지는 오직 챕터 1의 문제 4를 가지고 있어서, 2 페이지에는 특별한 문제가 없다. 챕터 2는 페이지 3에서 시작하고, 2개의 문제가 있다. 3 페이지에는 문제 3이 없어서, 이 페이지에는 특별한 문제가 없다. 그녀의 문제집에 특별한 문제는 1개 있다.

Function

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

  • int n: 챕터의 개수
  • int k: 페이지당 가질 수 있는 문제의 최대 개수
  • int arr[n]: 각 챕터에 있는 문제 수

Return

  • int: 문제집에 있는 특별한 문제 수

Constraints

  • 1 <= n, k, arr[i] <= 100

풀이

반복문을 사용해서 현재 페이지, 현재 챕터, 스페셜 문제의 수를 계속 변경하면서 문제를 풀었다.
먼저 nowPage를 선언하고 1을 할당, nowChapter를 선언하고 0을 할당, specialProblem을 선언하고 0을 할당한다.

int nowPage = 1;
int nowChapter = 0;
int specialProblem = 0;

while문을 통해 nowChapter를 n보다 작을 때까지 반복한다. arr이 0번부터 시작하기 때문이다.

while(nowChapter < n){

}

while문 안에 for문을 사용하는데 i = 1부터 arr.get(nowChapter)까지 반복한다. 문제는 1번부터 시작하기 때문에 마지막 항목까지 포함했다.

// while문 안에서
for(int i = 1; i <= arr.get(nowChapter); i++){

}

이제 for문 안에서 조건문을 사용해서 스페셜 문제를 찾고 현재 페이지를 변경한다.

// for문 안에서
if(i == nowPage){
	specialProblem++;
}

if(i % k == 0){
	nowPage++;
}

for문을 빠져나와 해당 챕터의 문제 수를 통해 현재 페이지를 증가시킨다. 왜냐하면 새로운 챕터가 시작할때 새로운 페이지에서 시작하기 때문이다. 그리고 해당 챕터의 문제를 모두 순회 했기 때문에 챕터를 증가시킨다.

// while문 안에서
if(arr.get(nowChapter) % k > 0){
	nowPage++;
}

nowChapter++;

마지막으로 specialProblem을 반환한다.

return specialProblem;

전체 코드

public static int workbook(int n, int k, List<Integer> arr) {
	int nowPage = 1;
	int nowChapter = 0;
	int specialProblem = 0;

	while(nowChapter < n){
		for(int i = 1; i <= arr.get(nowChapter); i++){
			if(i == nowPage){
				specialProblem++;
			}

			if(i % k == 0){
				nowPage++;
			}
		}

		if(arr.get(nowChapter) % k > 0){
			nowPage++;
		}

		nowChapter++;
	}

	return specialProblem;
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글