정보실

웹학교

정보실

php 카타 : 내림차순

본문

과업 설명 


당신의 임무는 음수가 아닌 정수를 인수로 받아 내림차순으로 숫자와 함께 반환하는 함수를 만드는 것입니다. 기본적으로 숫자를 재정렬 하여 가능한 가장 높은 숫자를 만듭니다.


예:

Input: 21445 Output: 54421 

Input: 145263 Output: 654321 

Input: 1254859723 Output: 9875543221


작업 솔루션 


테스트


우리는 몇 가지를 테스트하고 싶습니다 :

  1. 함수가 유효하지 않은 입력 유형에 대해 오류를 제공합니까?
  2. 이 함수는 양수가 아닌 정수 입력에 오류를 제공합니까?
  3. 유효한 입력에서 기능이 예상대로 작동합니까

테스트를 위해 PHPUnit을 사용했습니다. 또한 32 비트 및 64 비트 시스템에서 가능한 가장 큰 숫자가 여전히 작동하는지 확인합니다. 이보다 높으면 ParseError가 CompileError를 확장하므로 ParseError가 컴파일 단계에서 발생합니다.


이 모든 것을 고려하여 아래 테스트 사례를 작성했습니다.


class DescendingOrderTests extends TestCase {
    public function testNegativeNumbers() {
        $this->expectException(InvalidArgumentException::class);
        descendingOrder(-1);
    }

    public function testInvalidInput() {
        $this->expectException(TypeError::class);
        descendingOrder("test");
    }
    public function testSmallNumbers() {
        $this->assertSame(0, descendingOrder(0));
        $this->assertSame(1, descendingOrder(1));
    }

    public function testMediumNumbers() {
        $this->assertSame(51, descendingOrder(15));
        $this->assertSame(2110, descendingOrder(1021));
    }

    public function testLargeNumbers() {
        $this->assertSame(987654321, descendingOrder(123456789));
        if(PHP_INT_SIZE === 4) { // 32bit system
          $this->assertSame(7463847412, descendingOrder(PHP_INT_MAX));
        } else if(PHP_INT_SIZE === 8) { // 64bit system
          $this->assertSame(9223372036854775807, descendingOrder(PHP_INT_MAX));
        }
    }
}


function descendingOrder(int $number): int {
  if($number < 0) {
    throw new InvalidArgumentException("The param \$number must be a positive integer");
  }
  $numarray = str_split($number);
  rsort($numarray);
  return (int) join($numarray);
}

먼저 내림차순 함수를 작성하면 정수가 될 것으로 예상되는 입력 매개 변수를 가져 와서 정수를 리턴합니다.


참고 : PHP는 유형이 선언 된 경우에도 동적으로 유형이 지정된 언어이므로 float가 전달되면. 2.6이 2가 될 것이므로 제거 될 것입니다 .3이 될 것으로 예상되면 성가 시지만 공정성이 있습니다.이 구현을 위해 원하는 대로 작동하며 실제로 이 기능을 어느 정도 좋아하지만 반올림하면 좋을 것입니다 이 사용사례의 경우 실제로 🤷‍♂️는 중요하지 않지만 올바르게 수행되었습니다.


함수 본문에서 전달 된 숫자가 0보다 작은 지 확인하고 오류가 발생하면 작업 설명에 정의 된 양수인지 확인하십시오. 0 이상이면 정수이고 양수임을 알 수 있습니다.


PHP는 Type Juggling을 사용하므로 str_split 함수는 숫자를 문자열로 변환 한 다음 개별 문자로 분할합니다.


여기에서 주어진 배열 (이 경우 $ numarray)을 변경하는 rsort 함수를 사용하여 현재 요소의 순서를 반대로 합니다.


마지막으로 배열 요소를 단일 문자열로 결합한 다음 (int) 데코레이터를 사용하여 정수 값으로 반환합니다.


사이드 노트 


여기서 이상한 점은 (int) 데코레이터를 제거하면 PHP_INT_MAX 상수를 사용하는 testLargeNumbers 테스트를 제외한 모든 테스트가 통과된다는 것입니다.


어떤 이유로 상수가 함수에 전달 될 때 올바른 반환 유형을 제공하지 않습니다. TypeError : DowningOrder ()의 반환 값은 정수 유형이어야 합니다. 예를 들어 PHP_INT_MAX의 경우 반환되는 문자열이 발생합니다. 따라서 (int) 데코레이터를 사용하여 int 유형을 반환하고 우리를 위해 PHP 자체에 의존하지 않는 100 % 확신해야 합니다.


함수 시그니처에서 int를 반환한다고 말하고 PHP가 Type Juggling 시스템을 통해 int의 문자열 표현을 변환하는 방법을 알고 있기 때문에 이상합니다. 이것이 다른 모든 경우가 (int) 데코레이터 없이 암시 적으로 전달되는 방식이지만 상수는 어떻게 든 다르게 취급되는 것처럼 보입니다. 나는 분명히 이상하다고 생각하는 것은 그리 큰 일이 아니지만, 때때로 우리는 개발자로서 우리가 그러한 흥미로운 것들이 때때로 자라는 것을 발견합니다.


결론 


이것은 매우 간단한 작업이지만 가장 간단한 작업조차 배울 수 있는 기회를 제공하며,이 경우 PHP 유형이 자바 스크립트 또는 파이썬과 비교하여 어떻게 저글링 하는지에 대해 조금 더 배웠습니다.이 구현에서 내가 싫어하는 유일한 생각 rsort 함수의 사용법은 원래 배열의 돌연변이를 유발하기 때문입니다.


rsort를 변경하지 않는 대안으로 대체하기 위해 솔루션을 다시 구현하려는 경우 다음과 같이 구현할 수 있습니다.


function reverse_quick_sort(array $arr): array {
  if(count($arr) <= 1) return $arr;

  $pivot = $arr[0];
  $left = [];
  $right = [];

  for($i = 1; $i < count($arr); $i++) {
    $arr[$i] > $pivot ? $left[] = $arr[$i] : $right[] = $arr[$i];
  }

  return array_merge(
    reverse_quick_sort($left), 
    [$pivot], 
    reverse_quick_sort($right)
  );
}

function descendingOrder(int $number): int {
  if($number < 0) {
    throw new InvalidArgumentException("The param \$number must be a positive integer");
  }

  $numarray = str_split($number);
  $reversed = reverse_quick_sort($numarray);
  return (int) join($reversed);
}



  • 트위터로 보내기
  • 페이스북으로 보내기
  • 구글플러스로 보내기
  • 카카오톡으로 보내기

페이지 정보

조회 7회 ]  작성일19-12-02 16:21

웹학교