1Day 1Practice

[codewars] pick peaks

Bittersweet- 2022. 8. 4. 11:09
728x90

Instruction.

In this kata, you will write a function that returns the positions and the values of the "peaks" (or local maxima) of a numeric array.

 

For example, the array arr = [0, 1, 2, 5, 1, 0] has a peak at position 3 with a value of 5 (since arr[3] equals 5).

 

The output will be returned as an object with two properties: pos and peaks. Both of these properties should be arrays. If there is no peak in the given array, then the output should be {pos: [], peaks: []}.

 

Example: pickPeaks([3, 2, 3, 6, 4, 1, 2, 3, 2, 1, 2, 3]) should return {pos: [3, 7], peaks: [6, 3]} (or equivalent in other languages)

 

All input arrays will be valid integer arrays (although it could still be empty), so you won't need to validate the input.

 

The first and last elements of the array will not be considered as peaks (in the context of a mathematical function, we don't know what is after and before and therefore, we don't know if it is a peak or not).

 

Also, beware of plateaus !!! [1, 2, 2, 2, 1] has a peak while [1, 2, 2, 2, 3] and [1, 2, 2, 2, 2] do not. In case of a plateau-peak, please only return the position and value of the beginning of the plateau. For example: 

pickPeaks([1, 2, 2, 2, 1]) returns {pos: [1], peaks: [2]} (or equivalent in other languages)

 

Have fun!

 

이번 문제에서는 숫자로 구성된 배열에서 "peaks"값을 찾고 해당 값의 인덱스 값을 구하는 함수를 작성해야 한다.

 

예를 들어 배열 arr = [0, 1, 2, 5, 1, 0]은 세번째 위치에 5가 peaks 값이다.(arr[3]이 5이기때문에)

 

결과값은 pos와 peakes 프로퍼티를 가진 객체로 반환한다. 두 프로퍼티 모두 객체로 구성된다.

 

주어진 숫자 배열에서 peaks값이 없다면, {pos: [], peaks: []}를 반환한다.

 

예제: pickPeaks([3, 2, 3, 6, 4, 1, 2, 3, 2, 1, 2, 3])은 {pos:[3, 7], peaks: [6, 3]}을 반환한다(또는 이에 상응하는 값)

 

주어진 숫자 배열은 정수로 이루어진 배열이므로(빈 값일 수도 있다), 배열의 값을 검증할 필요가 없다.

 

배열의 제일 처음과 마지막 요소는 peaks에서 제외된다.(수학 함수의 맥락에서 이전과 그 후의 값을 알 수 없으므로, 우리는 처음과 마지막 요소가 peaks 값인지 알 수 없다)

 

또한, peaks가 없는 배열을 주의해라!!! [1, 2, 2, 2, 1]은 peaks가 있지만 [1, 2, 2, 2, 3] 과  [1, 2, 2, 2, 2]는 peaks 가 없다. 이런 경우, 요소 중 첫 높은 값의 인덱스와 값을 반환해라. 예를 들어:

pickPeaks([1, 2, 2, 2, 1])은 {pos: [1], peaks: [2]}을 반환한다.(또는 이에 상응하는 값)

 

즐퀴~!!

 


 

Solution.

function pickPeaks(arr) {
  const result = {pos: [], peaks: []};
  
  if(arr.length > 2) {
    let pos = -1; // 초기화
    
    for(let i=0; i < arr.length; i++) {
      if(arr[i] > arr[i-1]) { // 이전값 < 현재값
        pos = i; // true인 경우, 두번째 조건문에서 활용
      } else if(arr[i] < arr[i-1] && pos != -1) { // 현재값 > 다음값 && 이전값 < 현재값
        result.pos.push(pos);
        result.peaks.push(arr[pos]);
        pos = -1; // 다시 초기화
      }
    }
  }
  return result;
}

 

Other solution.

function pickPeaks(arr) {
  var pSlop = 0, pi = 0;
  var result = {pos: [], peaks: []};
  
  if(arr.length === 0) return result;
  
  arr.reduce(function(p, c, i) {
    if(pSlop > 0 && c - p < 0) {
      result.peaks.push(p);
      result.pos.push(pi);
    }
    if(c-p != 0){
      pi = i;
      pSlop = c-p;
    }
    return c;
  });
  
  return result;
}

 

'1Day 1Practice' 카테고리의 다른 글

[codewars - 5kyu] Tic-Tac-Toe Checker  (0) 2022.08.09
[codewars] Sum of pairs  (0) 2022.08.05
[codewars] Simple Pig Latin  (0) 2022.08.02
[codewars] Moving Zeros To The End  (0) 2022.07.12
[codewars] Count characters in your string  (0) 2022.07.08