>웹 프론트엔드 >JS 튜토리얼 >Codewars - 피크 선택

Codewars - 피크 선택

Patricia Arquette
Patricia Arquette원래의
2025-01-11 06:59:43725검색

안녕하세요.

Codewars - Pick peaks

이번 시리즈에서는 Codewars의 도전 과제와 저의 사고 과정을 포스팅하고 있습니다. 가능할 때마다 JS와 Node 18을 사용하고 있습니다. 명확성을 위해 공정하게 사용하고 있습니다.

휴식을 했다가 이제 돌아왔습니다. 하지만 여기에 솔루션을 게시하지 않고 몇 가지 문제를 해결했습니다. 쉬운 도전으로 접근해보자.

Pick peaks는 재미있는 게임입니다. 수학적 정의에 따라 국소 최대값을 찾아야 합니다. GFG에서:

수학적으로 f(a) ≥ f(a -h) 및 f(a) ≥ f(a h) 여기서 h > 0이면 a를 Local maximum point라고 합니다.

본질적으로 어떤 값이 가장 가까운 이웃 값보다 큰지 확인해야 합니다. 이웃이 누락된 경우 로컬 최대값인지 여부를 확인할 수 없습니다. 그래서 우리는 배열의 경계를 확인하지 않을 것입니다.

다음 솔루션은 최적화되지 않았습니다. 1회 통과여야 합니다. 게다가 break를 사용하지 말고 계속하도록 배웠습니다. 하지만 제 역할은 합니다.

먼저 규칙을 설정합니다.

  • 배열이 비어 있으면 빈 배열을 반환합니다. [] => {위치:[], 최고점:[]}
  • 값이 이전 값보다 작거나 같으면 자동으로 삭제됩니다(고원은 다른 규칙으로 처리됩니다). (배열[i] <= 배열[i-1]) ? 버리다
  • 이전 규칙에 따라 값이 삭제되지 않고 다음 값보다 큰 경우 최대값입니다. (배열[i] > 배열[i 1]) ? 최고
  • 앞서 언급한 규칙에 따라 값이 삭제되지 않고 다음 값과 동일한 경우 특별한 처리가 필요합니다. 이 문제는 나중에 해결하겠습니다.

두 번째로 특정 반환 값이 필요합니다: {pos:[], peaks:[]}
이 챌린지는 맥시마의 위치와 가치를 요구합니다.

셋째, 배열에 대한 루프를 설정해야 합니다.
for (let i = 1 ; i < arr.length -1 ; i )
첫 번째 값과 마지막 값은 정의에 따라 최대값이 될 수 없으므로 건너뜁니다.

넷째, 규칙을 구현합니다.

  for (let i = 1 ; i < arr.length -1 ; i++){
    if (arr[i] <= arr[i-1]){
      continue;
    }
    if (arr[i] > arr[i+1]){
      cache.pos.push(i);
      cache.peaks.push(arr[i]);
    }
    if (arr[i] == arr[i+1]){
      // TO DO
    }
  }




<p>마지막 부분을 다듬어야 합니다. 이것이 규칙을 정할 때 위에서 언급한 특별 대우입니다. 이는 하위 프로세스 역할을 하는 또 다른 루프일 뿐입니다.<br>
</p>

<pre class="brush:php;toolbar:false">    if (arr[i] == arr[i+1]){
      for (let j=i +1 ; j< arr.length - 1; j++){
        if (arr[j] == arr[j+1]){
          continue;
        }
        if (arr[j] < arr[j+1]){
          break;
        }
        if (arr[j] > arr[j+1]){
          cache.pos.push(i);
          cache.peaks.push(arr[i]);
        }
      }
    }

요약하면 다음과 같습니다.

function pickPeaks(arr){
  let cache = {pos:[], peaks:[]};
  if (arr == false) {
    return cache;
  }

  for (let i = 1 ; i < arr.length -1 ; i++){
    if (arr[i] <= arr[i-1]){
      continue;
    }
    if (arr[i] > arr[i+1]){
      cache.pos.push(i);
      cache.peaks.push(arr[i]);
    }
    if (arr[i] == arr[i+1]){
      for (let j=i +1 ; j< arr.length - 1; j++){
        if (arr[j] == arr[j+1]){
          continue;
        }
        if (arr[j] < arr[j+1]){
          break;
        }
        if (arr[j] > arr[j+1]){
          cache.pos.push(i);
          cache.peaks.push(arr[i]);
        }
      }
    }
  }

  return cache;
}

이제 테스트해 보겠습니다... 예! 통과했습니다! 제출하고...

아뇨. 뭐???

Codewars - Pick peaks

이 특정 테스트: pickPeaks([1,2,5,4,3,2,3,6,4,1,2,3,3,4,5,3,2,1,2,3, 5,5,4,3])
이는 다음을 반환해야 합니다: {pos:[2,7,14,20], peaks:[5,6,5,5]}
반환값: {pos:[2,7,14,20,20], 최고점:[5,6,5,5,5]}

근데 왜요? 논리는 타당합니다. 그리고 모든 루프가 올바르게 작동합니다... 음... 잠깐... 중복됩니다. 위치 20, 값 5. 거기에 두 번 있습니다. 여기에 문제가 있습니다.

  for (let i = 1 ; i < arr.length -1 ; i++){
    if (arr[i] <= arr[i-1]){
      continue;
    }
    if (arr[i] > arr[i+1]){
      cache.pos.push(i);
      cache.peaks.push(arr[i]);
    }
    if (arr[i] == arr[i+1]){
      // TO DO
    }
  }

Dev Tools로 디버깅을 한 후 찾았습니다. 문제는 다음과 같습니다.

    if (arr[i] == arr[i+1]){
      for (let j=i +1 ; j< arr.length - 1; j++){
        if (arr[j] == arr[j+1]){
          continue;
        }
        if (arr[j] < arr[j+1]){
          break;
        }
        if (arr[j] > arr[j+1]){
          cache.pos.push(i);
          cache.peaks.push(arr[i]);
        }
      }
    }

break 문이 누락되었습니다. [...3,5,5,4,3]은 이 종료 조건이 발생하는 시퀀스를 찾을 때만 내부 루프에서 벗어나기 때문에 두 번째 값을 복제합니다.

function pickPeaks(arr){
  let cache = {pos:[], peaks:[]};
  if (arr == false) {
    return cache;
  }

  for (let i = 1 ; i < arr.length -1 ; i++){
    if (arr[i] <= arr[i-1]){
      continue;
    }
    if (arr[i] > arr[i+1]){
      cache.pos.push(i);
      cache.peaks.push(arr[i]);
    }
    if (arr[i] == arr[i+1]){
      for (let j=i +1 ; j< arr.length - 1; j++){
        if (arr[j] == arr[j+1]){
          continue;
        }
        if (arr[j] < arr[j+1]){
          break;
        }
        if (arr[j] > arr[j+1]){
          cache.pos.push(i);
          cache.peaks.push(arr[i]);
        }
      }
    }
  }

  return cache;
}

그렇지 않으면 계속 진행됩니다. 최대값을 찾으면 종료되어야 합니다.

    if (arr[i] == arr[i+1]){
      for (let j=i +1 ; j< arr.length - 1; j++){
        if (arr[j] == arr[j+1]){
          continue;
        }
        if (arr[j] < arr[j+1]){
          break;
        }
        if (arr[j] > arr[j+1]){
          cache.pos.push(i);
          cache.peaks.push(arr[i]);
        }
      }
    }

수정됨:

        if (arr[j] > arr[j+1]){
          cache.pos.push(i);
          cache.peaks.push(arr[i]);
        }

비효율적이지만 효과적입니다.

조심하세요. 물을 마셔요???.

이전

위 내용은 Codewars - 피크 선택의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.