문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음
리사는 막 새로운 수학 문제집을 얻었다. 문제집은 챕터로 묶어진 연습 문제를 포함하고 있다. 리사는 캡터 내에서 페이지와 문제 번호가 같다면 특별한 문제라고 믿는다. 리사의 책은 다음과 같이 구성되어있다.
리사의 문제집의 정보가 주어질때, 스페셜 문제의 개수를 구해라.
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개 있다.
serviceLane 함수를 완성해라.
serviceLane 함수는 아래와 같은 매개변수를 가지고 있다.
반복문을 사용해서 현재 페이지, 현재 챕터, 스페셜 문제의 수를 계속 변경하면서 문제를 풀었다.
먼저 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;
}