안녕하세요.
이번 시리즈에서는 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를 사용하지 말고 계속하도록 배웠습니다. 하지만 제 역할은 합니다.
먼저 규칙을 설정합니다.
두 번째로 특정 반환 값이 필요합니다: {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; }
이제 테스트해 보겠습니다... 예! 통과했습니다! 제출하고...
아뇨. 뭐???
이 특정 테스트: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!