正方形
2637 ワード
function solution(w, h) {
[w, h] = w <= h ? [w, h] : [h, w];
let movedDistance, i = 0, cutedSquare = h;
while(i < w){
i++;
movedDistance = h*i/w;
if(!Number.isInteger(movedDistance)) cutedSquare++;
}
return (w*h) - cutedSquare;
}
に近づく
解説
[w, h] = w <= h ? [w, h] : [h, w];
構造分解配分,小変w,大変hlet movedDistance, i = 0, cutedSquare = h;
短辺の長さiは、対角線が1移動するたびに移動するmovedDistance=0であり、移動するたびに、対角線が頂点に達し、最も少ないメッシュ(正方形)がカットされると、数値から逆数cutedSquare!
while(i < w){
i++;
movedDistance = h*i/w;
if(!Number.isInteger(movedDistance)) cutedSquare++;
}
前述の方法によれば、iが小辺の長さ1で移動するときmoveddistanceが整数でない場合、クリップされた矩形の個数++になります.
難点
h * (i/w)
(h/w) * i
2つの演算はまったく同じように見えますが、異なる結果値が出力される場合があります.
結果は10進数を使う私たちと違って、2進数を使うコンピュータは小数点を計算する時
無限小数などの原因で消失します.
すなわち,上記の演算には他の結果値も存在する可能性がある.
実際、これも解答の過程で困難に直面した部分です.
最初は、浮動小数点に関連しています.
テスト盤は横8歳12歳だったからだ.
1つの数字0に加えて、3分の2の数字を加えます.
4の時に3.99999999999996の姿が現れるはずです.
その時から、私の表現力は背景知識に追いつかないと思います.
整数部と小数部の精度を改めて知り,解答を行った.
改善
コードの速度が思ったより速くないからです.
ゲートに条件文を追加するにはwhile
頂点に達したら、
水平%iと垂直%iの残りのすべての値が0の場合(領域の頂点に達するまで繰り返します)
だから何度も何度も何度もやって、whileがドアを閉める雄大な計画!
思ったより失敗例が多かったのですが、どうやって解決するのか!
まず既存のコードで実行する速度!
補足後の実行速度!
終了条件文があるかどうかで、試験例12は364 msから0.10 msに突破した.
ユークリッド号よりは速度が遅いですが.
私は解答の過程で考えられなかった方法で解決したくない.
ちょっと頑固な人ですか?
補足コード
function solution(w, h) {
[w, h] = w <= h ? [w, h] : [h, w];
let movedDistance, i = 0, cutedSquare = h;
while(i < w){
i++;
movedDistance = h*i/w;
if(!Number.isInteger(movedDistance)) cutedSquare++;
else{
if (i === 1) break;
else if (w%i === 0 && h%i === 0 && w !== h) {
cutedSquare += w/i - 1;
break;
}
}
}
return (w*h) - cutedSquare;
}
Reference
この問題について(正方形), 我々は、より多くの情報をここで見つけました https://velog.io/@hyeon4137/프로그래머스-멀쩡한-사각형テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol