행렬의 패턴을 다루는 논리를 작성하는 방법

이 기사를 쓴 이유



잘 테스트 실시시에 이하와 같은 패턴을 망라하기 위한 표를 쓰는 일이 있다고 생각한다.


A 데이터
B 데이터






×

×


×
×


이 패턴 커버리지가 코딩 테스트를 할 때 필요할 수 있습니다.
이것을 프로그래밍으로 쓸 때까지가 상당히 힘들었기 때문에 메모해 둔다.

프로그램



다음과 같이 쓰면 패턴표를 얼마든지 취득할 수 있다.
<?php
$num = 4; // true/falseの4つのデータがある時
for ($i = 0; $i < (1 << $num); $i++) {
  for ($j = $num - 1; $j >= 0; $j--) {
    if ($i & (1 << $j)) {
      echo '×';
    } else {
      echo '○';
    }
  }
  echo PHP_EOL;
}

「<<」나 「&」는 시프트 연산자이다.
2 진수로 값을 시프트함으로써 패턴 망라의 처리가 훨씬 간단해진다.

상기 출력 내용은 다음과 같다.
○○○○
○○○×
○○×○
○○××
○×○○
○×○×
○××○
○×××
×○○○
×○○×
×○×○
×○××
××○○
××○×
×××○
××××

테이블처럼 쓰고 싶다면 다중 배열에 넣고 테이블에 일어나면 좋다.
<?php
echo array2table(create_pattern(4)); // true/falseの4つのデータがある時

function create_pattern($num){
  $board = [];
  for ($i = 0; $i < (1 << $num); $i++) {
    for ($j = $num - 1; $j >= 0; $j--) {
      if ($i & (1 << $j)) {
        $board[$i][] = '×';
      } else {
        $board[$i][] = '○';
      }
    }
  }
  return $board;
}

// 参考:https://www.pahoo.org/e-soul/webtech/php02/php02-46-01.shtm#array2table
function array2table($arr) {
  if (!is_array($arr)) return false;
  $keys1 = array_keys($arr); //1次元目のキー取得
  $keys2 = array_keys($arr[$keys1[0]]); //2時限目のキー取得
  if (is_array($arr[$keys1[0]][$keys2[0]])) return false; //3次元以上

  $n = count($arr[$keys1[0]]); //要素の数
  $html = "<table class=\"array\">\n";

  //要素名
  $html .= "<tr><th>Key</th>";
  for ($i = 0; $i < $n; $i++) {
    $html .= "<th>{$keys2[$i]}</th>";
  }
  $html .= "</tr>\n";

  //配列本体
  foreach ($arr as $key=>$arr1) {
    $html .= "<tr><th>{$key}</th>";
    for ($i = 0; $i < $n; $i++) {
      $html .= "<td>{$arr1[$keys2[$i]]}</td>";
    }
  }
  $html .= "</tr>\n</table>\n";

  return $html;
}

HTML로 출력하면 다음과 같은 느낌으로 표시된다.



상기 패턴 망라 프로그램, 코딩 테스트 등에서 필요한 기회가 많은 인상이 있다.
편리하기 때문에 꼭 활용해보고 싶습니다.

참고


  • PHP로 2차원 배열 TABLE 표시
  • 비트 연산자
  • 동전 뒷면의 패턴을 표시하고 싶습니다.
  • 좋은 웹페이지 즐겨찾기