📚
[HackerRank] Flipping the Matrixの解説
問題文
はじめに
最近久しぶりにアルゴリズムの勉強を再開しました。
1年前ほどにAtcoderの緑まで到達したきり何もしていなかったので肩慣らし中です。
今回Flipping the Matrixが全然解けなかったので、復習した過程を備忘録として残しておきます。
解法
概要
列と行の反転を無制限に行える という制約の本質を見抜く必要がありました。
実は各セルの移動範囲には規則性があり、とても限定的な範囲のため、この点を見抜ければ後は単純なコードに落とすだけです。
可視化
まずは、先述した規則性を把握しやすくするために可視化してみます。
下図が
セルの値は
また、赤線の中にある値の合計が最大値になることがゴールです。
ポイントは
式化
上記を
式にすると
最終的なコードは下記になります。
flippingMatrix
function flippingMatrix(matrix: number[][]): number {
const h = matrix.length;
const w = matrix[0].length;
const n = Math.floor(matrix.length/2);
const l = 2*n-1
let sum = 0;
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
sum += Math.max(matrix[i][j], matrix[i][l-j], matrix[l-i][j],matrix[l-i][l-j])
}
}
return sum;
}
参考
解説に出てくる図を見て、そうゆうことか!ってなりました
Discussion