> 웹 프론트엔드 > JS 튜토리얼 > 빨간 코 보고서

빨간 코 보고서

DDD
풀어 주다: 2024-12-04 19:47:11
원래의
200명이 탐색했습니다.

Red-Nosed Reports

코드 2024의 출현 2일차

1부

그냥 해결할까요, 아니면 최적으로 해결할까요? 그것이 질문이다

해결 방법:

  • 원본 순서대로 목록을 각각 역순으로 정렬된 사본 두 개와 비교합니다. 하나가 일치하면 기준 1에 대한 성공입니다
  • 첫 번째 항목을 제외하고 목록의 모든 항목을 반복합니다. 각 항목과 이전 항목의 차이점을 추적합니다. 차이가 0이거나 3보다 크면 이 테스트는 실패합니다.

성능 측면에서 이는 다음을 의미합니다.
기준 1의 경우:

  • 목록 사본 2개
  • 각 사본 정렬
  • 원본 목록을 두 번 비교 기준 2의 경우:
  • 각 목록의 모든 숫자를 확인하세요

최적으로 해결하려면:

  • 기준 2의 경우 while 루프를 활용하여 후속 숫자에서 유효한 차이가 있는지 확인하겠습니다. 이렇게 하면 실격 차이가 발생하자마자 나머지 번호는 처리되지 않습니다
  • 기준 1의 경우 차이점을 추적한 다음 모두 0보다 작거나 큰지 한 번 확인합니다

이것이 효과가 있을 것으로 생각합니다. 알아낼 수 있는 방법은 단 하나입니다.

최적화된 알고리즘 작성

다음은 기준 2(1, 2 또는 3의 차이)를 식별하는 코드입니다.

let differFlag = true;
let i = 1;
while (differFlag && i < list.length) {
  let amount = Math.abs(list[i] - list[i - 1]);
  if (![1, 2, 3].includes(amount)) {
    differFlag = false;
  }
  i++;
}
로그인 후 복사
  • 유효하지 않은 차이가 발견될 때까지만 목록을 '탐색'합니다.
  • 잡히자마자 while 루프가 종료됩니다
  • while 루프 후에는 DifferentFlag 결과를 확인할 수 있습니다

다음은 기준 1(모든 차이가 증가하거나 감소함)을 식별하는 코드입니다.

let differFlag = true;
let i = 1;
let differences = [];
while (differFlag && i < list.length) {
  let amount = list[i] - list[i - 1];
  differences.push(amount);
  if (![1, 2, 3].includes(Math.abs(amount))) {
    differFlag = false;
  }
  i++;
}
로그인 후 복사
  • 각 차이점에 대한 목록을 작성합니다
  • 실제로 차이의 부호를 포착하고 싶어서 절댓값 계산을 조건식으로 옮겼습니다
  • while 루프 후에 차이점을 확인하여 모든 값이 양수인지 음수인지 확인할 수 있습니다

안전한 신고를 캡처하는 최종 조건은 다음과 같습니다.

if (
     differFlag &&
    (differences.every((el) => el > 0) || 
     differences.every((el) => el < 0))
    ) {
      safeCount++;
    }
로그인 후 복사

전체적으로 내 알고리즘은 예제 입력에 대한 정답을 생성합니다.

퍼즐 입력에도 똑같이 적용되나요??

네에에에에에에에에에에에!!

달콤해요!

2부

음... 쏴.

이렇게 하면 상황이 좀 복잡해집니다.

보고서의 가능한 모든 순열을 확인하는 알고리즘은 피하고 싶습니다. 이를 위해서는 수백만 개의 보고서를 생성해야 합니다.

첫 번째 좋은 소식은 다음과 같습니다.

  • 모든 안전 신고는 여전히 안전한 것으로 간주됩니다

제가 입력한 퍼즐의 경우 순열을 확인할 필요가 없는 약 200개입니다.

그래도 800/1000은 순열을 완전히 탐색하기에는 여전히 많은 목록입니다.

솔직히 안전하지 않은 보고서의 각 순열에 대해 알고리즘 실행을 피할 수 있는 방법이 없습니다.

버머.

안전하지 않은 보고서의 각 숫자를 반복하는 루프를 추가할 시간입니다. 숫자를 제거한 다음 변경된 목록에서 합격 여부를 확인하세요.

순열 검사 루프 추가

각 후속 테스트 보고서에서 하나의 숫자를 복제하고 제거하기 위해 줄을 추가하여 while 루프를 복제했습니다.

코드가 훨씬 더 많습니다.

하지만 효과가 있어요! 퍼즐입력에 대한 정답을 생성해드려요!

질문:

  • 실행되고...내가 입력한 퍼즐에 대한 정답이 생성되나요?

실행해 볼까요...

흠, 실행이 되지만 파트 1 답변보다 약간 더 크다는 답변을 받았습니다. 틀린 것 같습니다.

제출해도 나쁘지 않겠죠????

그게 맞습니다 맞습니다!

신성한 연기!

정말 놀랍습니다!

그리고 정말 재미있습니다!

금별 4개가 3일차에 들어갑니다.

더욱 멋진 퍼즐을 만나보세요!

위 내용은 빨간 코 보고서의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿