반응형
주어진 배열에서 Peak를 찾아라.
peak란 배열의 요소 중에서 양 옆의 값보다 큰 요소의 인덱스를 뜻한다.
[1, 2, 3, 5, 4] -> Peak : 5
[1, 3, 2, 4, 5, 7, 6] -> Peak : 7
가장 쉬운 방법으로는 배열을 순회 하면서 양 옆의 값보다 큰 요소를 찾는 방법이 있겠다. (O(n))
그러나 가장 효율적인 방법은 O(logN)의 방법. 즉 Binary Search를 이용하는 것이다.
즉 나열된 값들의 중간 값(Pivot)을 찾고 그 다음 값이 Pivot 값보다 크면 오른쪽, 작으면 왼쪽으로 인덱스를 옮기는 방식으로 탐색을 진행 한다.
#include <iostream>
int findPeakElement(int* nums, int numSize)
{
int left = 0;
int right = numSize - 1;
// 배열의 크기
if(numSize <= 1) return 0;
while (left < right)
{
int pivot = (left + right) / 2;
int num = nums[pivot];
int nexNum = nums[pivot + 1];
if (num < nexNum)
{
// 이 경우 Peak는 num의 오른쪽에 있다.
left = pivot + 1;
}
else
{
right = pivot;
}
}
//return left;
return right;
}
int main()
{
int numSize = 7;
int nums[] = { 1, 3, 2, 4, 5, 7, 6};
int peak = findPeakElement(nums, numSize);
std::cout << "peak : " << peak << std::endl;
}
반응형
'프로그래밍 이야기 > C++ 기초' 카테고리의 다른 글
Find Pivot Index (0) | 2021.10.19 |
---|---|
Move Zeros (0) | 2021.10.18 |
이진 탐색 (Binary search) (0) | 2021.10.18 |
함수 오브젝트와 람다 표현식 (0) | 2021.09.17 |
[Design Pattern] Container (0) | 2021.02.05 |