행렬의 패턴을 다루는 논리를 작성하는 방법
이 기사를 쓴 이유
잘 테스트 실시시에 이하와 같은 패턴을 망라하기 위한 표를 쓰는 일이 있다고 생각한다.
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로 출력하면 다음과 같은 느낌으로 표시된다.
상기 패턴 망라 프로그램, 코딩 테스트 등에서 필요한 기회가 많은 인상이 있다.
편리하기 때문에 꼭 활용해보고 싶습니다.
참고
Reference
이 문제에 관하여(행렬의 패턴을 다루는 논리를 작성하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ono-soic/items/a6c251c108a1a1706963텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)