티스토리 뷰

링크 : 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수 중 큰 값으로 갱신.

 

 

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함