はじめに
paizaでアルゴリズムを学習し始めて日が浅いです
ランクBになると途端にコードが長くなり混乱中です
Aランクアップメニュー > マップの判定・縦横 (paizaランク B 相当)の回答に対して理解を深めたいと考え記事にしています
⚠シェア可能な問題集の問題です
⚠リファクタリングとかはせず愚直に与えられた回答を使用しています
また、問題をご存知な方前提になっていますので入力例・出力例は載せていません
回答
h, w = gets.split.map(&:to_i)
board = h.times.map { gets.split('') }
board.each.with_index do |row, y|
row.each_index do |x|
flag_row = false
flag_clm = false
if x == 0 || row[x - 1] == '#'
flag_row = true if x == w - 1 || row[x + 1] == '#'
end
if y == 0 || board[y - 1][x] == '#'
flag_clm = true if y == h - 1 || board[y + 1][x] == '#'
end
puts y.to_s + ' ' + x.to_s if flag_row && flag_clm
end
end
コメントアウト入れる
h, w = gets.split.map(&:to_i)
# board配列に入力例を全て入れていく
board = h.times.map { gets.split('') }
# rowに一つずつ要素(3つ分)が入る、y(縦)には0から要素分順番に数字(0,1,2)が入る
board.each.with_index do |row, y|
# rowに入ってる要素分(見た目は3つだが実際は4つ分あるっぽい?)のindex x(横)を取得(0,1,2,3)
# → 0の場合はrowの1つ目の要素
row.each_index do |x|
flag_row = false
flag_clm = false
# 最初のifで左のマス・次のifで右のマスをチェック
# x == 0はxが1つ目の要素なら〜
# row[x - 1]は今いるポジションの一つ前の要素を参照
if x == 0 || row[x - 1] == '#'
# x == w - 1は右端なのかチェック(indexが0から始まるのでwを-1する)
# row[x + 1]は今いるポジションの次の要素を参照
flag_row = true if x == w - 1 || row[x + 1] == '#'
end
# yはxの縦バージョン、 縦軸を見てるのでboard(行でわけた2次元配列)を参照
# y == 0は一番上かどうか、 board[y - 1][x]は今いるポジションxの一つ上の要素を参照
if y == 0 || board[y - 1][x] == '#'
# y == h - 1は一番下かどうか、 board[y + 1][x]今いるポジションxの一つ下の要素を参照
flag_clm = true if y == h - 1 || board[y + 1][x] == '#'
end
# 上2つがtrueだったらその値を出力
puts y.to_s + ' ' + x.to_s if flag_row && flag_clm
end
end
最後に
いきなり難しいと感じましたが、やってることはシンプルでした
閲覧頂きありがとうございました!