[プログラマレベル2]n^2配列を切り取る

7953 ワード

質問する


https://programmers.co.kr/learn/courses/30/lessons/87390

問題を解く


コード(失敗)

function solution(n, left, right) {
    if(n===1) return 1;
    let arr=Array.from(Array(n), ()=>Array(n));
    for(let i=0; i<n; i++){
        for(let j=0; j<i+1; j++){
            if(typeof arr[i][j]==='undefined') arr[i][j]=i+1;
            if(typeof arr[j][i]==='undefined') arr[j][i]=i+1;
        }
    }
    return arr.flat().slice(left, right+1);
    
}
「signal:aborted(コアダンプ)」というエラーが発生しました(検索後に致命的なエラーであることがわかりました).

理由を探す過程で、0をアレイ要素(Array(n))に入れる.fill(0)でこのようなエラーが発生する可能性があるので、if(arr[i][j]===0)を上のアレイが空のコードであるかどうかを確認に変更しますが、だめです...
まずこの問題の答えはまだ見つかっていない.質問「質問」に文章が書いてありますので、後で確認しましょう.
この文章を参照すると、nは10^7に入力されるため、問題の順序でn*nが2次元配列を作成した後、1次元配列を作成し、効率テストでは合格できません.(それも、nが10^7であれば、n*nだと効率的に通れないのは当然ですが)エラー情報core dumpedを検索するとエラー情報が発見されてしまうのは、そのような原因であれば理解できます.

コード#コード#

function solution(n, left, right) {
    const ans = [];

    while (left <= right) {
        ans.push(Math.max(Math.floor(left / n), left++ % n) + 1);
    }

    return ans;
}
にぶんコード参照.どうやってこの法則性を見つけることができるのか...?
もし私のコードが答えが見えないならば、それをすべて削除して、新しい規則性を見つけます!

リファレンス

  • core dump https://ko.wikipedia.org/wiki/%EC%BD%94%EC%96%B4_%EB%8D%A4%ED%94%84
    https://blog.naver.com/sangyeung927/100193167051