[プログラマー]friends 4ブロック-javascript


📖 質問リンク
https://programmers.co.kr/learn/courses/30/lessons/17679
問題の説明
リンクに入るには詳細な説明があるので省略します.
👨‍💻 問題を解く
問題を解く
function solution(m, n, board) {
    board = board.map((x) => x.split(""));
    
    while(1) {
        const blocks = [];
        for (let i = 0; i < m - 1; i++) {
            for (let j = 0; j < n - 1; j++) {
                if (board[i][j] && board[i][j] === board[i + 1][j] && board[i][j] === board[i + 1][j + 1] && board[i][j] === board[i][j + 1]) {
                    blocks.push([i, j]);
                }
            }
        }
        
        if (!blocks.length) {
            return [].concat(...board).filter((x) => !x).length;
        }
        
        for (let numbers of blocks) {
            let [i, j] = numbers;
            board[i][j] = 0;
            board[i + 1][j] = 0;
            board[i + 1][j + 1] = 0;
            board[i][j + 1] = 0;
        }
        
        for (let i = m - 1; i > 0; i--) {
            if (!board[i].some((v) => !v)) continue;
            
            for (let j = 0; j < n; j++) {
            const zero = [];
            const text = [];
            
            for (let i = m - 1; i >= 0; i--) {
                !board[i][j] ? zero.push(i) : text.push(i);
            }
            
            if (zero.length !== m) {
                for (let idx in zero) {
                    for (let textIdx in text) {
                        if (zero[idx] > text[textIdx]) {
                            board[zero[idx]][j] = board[text[textIdx]][j];
                            board[text[textIdx]][j] = 0;
                            break;
                            }
                        }
                    }
                }
            }
        }
    }
}
}
筆者は、この問題の核心を突破した後、その位置をゼロに変える仕事だと考えている.
まず,2のfor文を用いて2*2ブロックを大まかに見つけ,見つけた位置を空の配列に保存した.
次に、関連する位置のテキストをすべて0に変換します.
そして問題は...
筆者はif(!board[i].some((v)=>!v)) continue; この部分は思いもよらなかった.
だからテスト5番と10番はずっと失敗しています.
筆者はブロックは垂直であると考え,垂直のみに注意し,下から零までの部分と文字のインデックスを比較することによって位置を変えようとしたが,上のいくつかを利用して横方向の部分が文字だけであるかどうかを確認する必要がある.
今回は奇数/偶数または複数のcoteで使用できる比較方法をいくつか知りました.
👨‍💻 他人のコード
function solution(m, n, board) {
    board = board.map(v => v.split(''));

    while (true) {
        let founded = [];

        // 찾기
        for (let i = 1; i < m; i++) {
            for (let j = 1; j < n; j++) {
                if (board[i][j] && board[i][j] === board[i][j - 1] && board[i][j] === board[i - 1][j - 1] && board[i][j] === board[i - 1][j]) {
                    founded.push([i, j]);
                }
            }
        }

        if (! founded.length) return [].concat(...board).filter(v => ! v).length;

        // 부수기
        founded.forEach(a => {
            board[a[0]][a[1]] = 0;
            board[a[0]][a[1] - 1] = 0;
            board[a[0] - 1][a[1] - 1] = 0;
            board[a[0] - 1][a[1]] = 0;
        });

        // 재정렬
        for (let i = m - 1; i > 0; i--) {
            if (! board[i].some(v => ! v)) continue;

            for (let j = 0; j < n; j++) {
                for (let k = i - 1; k >= 0 && ! board[i][j]; k--) {
                    if (board[k][j]) {
                        board[i][j] = board[k][j];
                        board[k][j] = 0;
                        break;
                    }
                }
            }
        }
    }
}
似たようなコードですが、並べ替えた部分はずっときれいです.
これは,道路を判断するfor文条件文に文字だけの道路が排除されているためかもしれない.
より多くの実装問題を解決し、簡潔なコードを作成するために努力します.2022.02.12