Contents

[Codility] Lesson10. Prime And Composite Numbers-Peaks C언어 풀이

   Oct 22, 2020     2 min read     - Comments

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;

마지막 부분을 변경해 주었다.