Torihaji's Growth Diary

Little by little, no hurry.

leetcode生活7日目

はじめに

随分ご無沙汰です。

なかなか続きません。

難しいからですかね。

今回の敵も強そうだ。

Valid Sudoku

9x9マスのボードに数字が並べられている。

下記の3つのルールを満たしていた場合trueを返す - 全ての列に1~9の数字が入る - 全ての行に1~9の数字が入る - 3x3のマスに1~9の数字が入る

解法(むずくないか)

少し読み違えていた。

実際にsudokuを解くのかと思っていたら、inputとして与えられた時点での盤面の妥当性を判断するだけで良いみたい。

途中まで

# @param {Character[][]} board
# @return {Boolean}
def is_valid_sudoku(board)
    rows = Array.new(9) { Set.new }
    cols = Array.new(9) { Set.new }
    boxes = Array.new(9) { Set.new }
    
    (0..9).each do |i|
        (0..9).each do |j|
            val = board[i][j]
            next if val == "."

            rows[i].include?(val) ? rows[i].add(val) : return false
            cols[j].include?(val) ? cols[j].add(val) : return false
        end
    end
end

boxはどうやってやるんだろうか。

これは無理だ。

# @param {Character[][]} board
# @return {Boolean}
def is_valid_sudoku(board)
    rows = Array.new(9) { Set.new }
    cols = Array.new(9) { Set.new }
    boxes = Array.new(9) { Set.new }
    
    (0...9).each do |i|
        (0...9).each do |j|
            val = board[i][j]
            next if val == "."

            rows[i].include?(val) ? (return false) : rows[i].add(val)
            cols[j].include?(val) ? (return false) : cols[j].add(val)

            box_index = ( i / 3) * 3 + ( j / 3 )
            boxes[box_index].include?(val) ? (return false) : boxes[box_index].add(val)
        end
    end
    true
end

今回得た教訓。

ruby三項演算子でreturnするにはかっこいる。

あとbox_indexのカラクリに気づけるか否か。

こっちの書き方の方がスマートかもしれない。

# @param {Character[][]} board
# @return {Boolean}
def is_valid_sudoku(board)
    rows = Array.new(9) {[]}
    cols = Array.new(9) {[]}
    boxes = Array.new(9) {[]}

    (0...9).each do |row|
        (0...9).each do |col|
            c_num = board[row][col]
            next if c_num == "."

            bi = (row/3)*3 + (col/3)

            if(rows[row].include?(c_num) || cols[col].include?(c_num) || boxes[bi].include?(c_num) )
                return false
            end

            rows[row] << c_num
            cols[col] << c_num
            boxes[bi] << c_num
        end
    end
    true
end

あとrubyはメソッドの最後の評価した値が戻り値になるのでreturnと書かなくても良いていう

この風潮。未だ慣れん。

終わりに

解けない問題が増えてきた。

んー悩みどころ。