[Codility] Lesson10. Prime And Composite Numbers-Peaks C언어 풀이
1. 문제
배열의 칸을 나누었을 때, 모든 칸에 peak가 존재하는지 확인하는 문제
2. 정답
첫번째 - 81점
$O(N * log(log(N)))$
#define MAX_SIZE 50000
int solution(int A[], int N) {
int peak[MAX_SIZE], top = 0;
//N의 길이가 1 ~ 100,000 이므로 3개이하의 배열에서는 peak가 생성되지 않는다.
if(N < 3)
return 0;
//peak구하기
for(int i = 1; i < N-1; i++){
if(A[i-1] < A[i] && A[i+1] < A[i])
peak[top++] = i;
}
int answer = 0;
//i = 나누는 칸의 수 이다. peak개수 이상으로 칸을 나누기가 불가능하므로 최대값은 top이다.
for(int i = 1; i <= top; i++){
if(N % i)
continue;
/* count - 나눈 칸의 현재 위치
index - peak 위치
range - 한칸의 범위
*/
int count = 0, index = 0, range = N / i;
while(count < i){
// peak의 위치가 나눈 칸보다 크면 나누기가 불가능하다.
if(((count+1) * range)-1 < peak[index])
break;
if(count * range <= peak[index++])
count++;
}
if(count != i)
break;
answer = i;
}
return answer;
}
2문제가 오답이 나왔는데 예제를 보여주지 않았다. 답은 둘다 4인데 내가 코딩한 답은 2를 반환하였다고 하였다.
나는 현재 나눈칸이 조건에 부합하지 않으면 칸을 더 나누어도 답은 나오지 않을 거라고 생각 하였는데, 3칸으로 나누었을 때, 조건에 부합하더라도, 4칸으로 나누기가 가능한 예제가 존재 하였다.
if(count == i)
answer = i;
else if(i > 4)
break;
마지막 부분을 변경해 주었다.