반응형
이미 Peaks #2에서 100%를 달성했지만, 조금 더 수정해보자.
1. 속도 개선 아이디어
Peak 조건을 제외하고, 최대 블럭 수를 구한다면, 최대 블럭 수는 몇 개 일까? 정답, N개
그렇다면 Peak 조건을 추가해서, 최대 블럭수를 구한다면, 최대 블럭 수는 몇 개 일까? Peak개
이전까지는 최소 약수로 시작해서, 최대 블럭 수를 찾아봤다.
이번에는 반대로 최대 블럭 수(Peak 개)로 시작해서, 최소 블럭 수(1개) 순서로 찾아보면 어떨까?
이렇게 하면, 중간에 '약수를 구하는 코드'와 '약수 정렬 코드'를 제거할 수 있다.
2. 코드 (C++)
peak 구하기 → 최대 블럭 수 구하기
int solution(vector<int> &A) {
//peak 구하기
vector<int> peaks = {};
for(size_t i = 1; i < A.size()- 1; i++)
{
if(A[i - 1] < A[i] && A[i] > A[i + 1])
{
peaks.emplace_back(i);
}
}
//peak가 없으면, block도 없다
if(peaks.empty()) return 0;
//최대 블럭 수 구하기
int N = static_cast<int>(A.size());
int max_block = static_cast<int>(peaks.size());
while(max_block > 1)
{
//약수 확인
if(N % max_block == 0) //max_block이 약수라면
{
int divisor = N / max_block; //각 블럭의 요소 개수
int start = 0; //블럭 시작 index
int end = divisor - 1; //블럭 끝 index
size_t p = 0;
do
{
//블럭 안에 peak가 있는지 확인
while(p < peaks.size())
{
if(start <= peaks[p] && peaks[p] <= end) break;
p++;
}
if(p >= peaks.size()) break;
start += divisor;
end += divisor;
}while(start < N);
if(start >= N) return N / divisor; //최대 블럭 수를 찾았다
}
max_block--;
}
return max_block;
}
3. 결과

반응형
'Algorithm Problem > Codility' 카테고리의 다른 글
| Lesson 11. Sieve of Eratosthenes - CountNonDivisible #2 (속도 개선) (1) | 2024.12.29 |
|---|---|
| Lesson 11. Sieve of Eratosthenes - CountNonDivisible #1 (0) | 2024.12.29 |
| Lesson 10. Prime and composite numbers - Peaks #2 (속도 개선-1) (0) | 2024.12.28 |
| Lesson 10. Prime and composite numbers - Peaks #1 (0) | 2024.12.28 |
| Lesson 10. Prime and composite numbers - Flags #4 (번외) (0) | 2024.12.25 |