티스토리 뷰
링크 : https://codility.com/programmers/lessons/10-prime_and_composite_numbers/flags/
문제>
* 배열 A에서 0 < P < N - 1 && A[P-1] < A[P] > A[P+1] 인 값들을 찾아 Peak를 만든다.(중간중간 튀는 높은 값을 뽑으라는 소리)
* K는 플래그(깃발) 간의 간격이자 Peak에 설치가능한 최대 플래그(깃발) 수.
- K번째 플래그 사용시 두 플래그 사이의 거리는 K보다 커야한다.
* 플래그 사이간격은 절대값이다.
* 이때 최대 설치 가능한 플래그(깃발) 수를 구하라.
해결방법.
1) A[P-1] < A[P] > A[P+1]인 P를 담은 Peaks리스트를 생성.
*리스트 수가 3보다 작으면 위의 식이 성립 안되기 때문에 리스트 수를 리턴.
2) flags(깃발) 사이의 간격이자 최대 flags 수 K를 Peaks의 수와 같을 때 까지 flags 수를 증가하면서 검색.
- 내부에 반복문을 추가해 Peaks수 만큼 검색.
-(K는 2부터시작. 간격을 구해야 하기 때문. 이미 하나는 꽂고 시작하기 때문에 flags은 1부터 시작.)
- 만약, peak - next_peak(peak + 1)의 절대값이(간격) K보다 크거나 같으면 flags 수를 증가.
-peak은 현재의 next_peak로 변경(*간격조건이 맞은 next_peak부터 찾아야 하기 때문), next_peak는 peak + 1로 변경.
- 다르다면 다음 peak는 유지하고 next_peak를 증가.
- 만약 next_peak와 Peaks의 수가 같거나 꽂은 flags 수와 K가 같다면 반복을 멈춤.
- 만약, 받아놓은 flags 최대 수보다 이번에 꽂은 flags 수가 작다면 받아놓은 값 리턴.
- (줄어드는 시점부터 간격이 벌어질 수록 더 적게 꽂을 수 밖에 없다.)
- 아니라면 flags수와 기존 flags수 중 큰 값으로 갱신.
'주간 알고리즘풀기' 카테고리의 다른 글
[171122][HackerRank](C#)Climbing the Leaderboard (0) | 2017.11.27 |
---|---|
[171121][HackerRank](C#)Mark and Toys (0) | 2017.11.21 |
[171116][Codility](C#)Missing Integer (0) | 2017.11.20 |
[171117][Codility](C#)Fish (0) | 2017.11.20 |
[171115][Codility](C#)TapeEquilibrium (0) | 2017.11.16 |