日別アーカイブ: 2022年10月30日

PaizaAランクLvアップ問題と解説(Ruby)その1

※スキルチェック問題ではありません。

規約により公式の解答コードそのままはよろしくないので、
オリジナルのコードにしています。

詳しくはコチラ

なるべくわかりやすい解説を付けました。

マップの判定・縦横

問題1:盤面の情報取得 (paizaランク C 相当)

行数 H , 列数 W の盤面があり、各マスには文字が 1 つだけ書かれています。盤面と N 個の y , x 座標 が与えられるので、与えられた座標の文字を順に出力してください。

なお、マスの座標系は左上端のマスの座標を ( y , x ) = ( 0 , 0 ) とし、
下方向が y 座標の正の向き、右方向が x 座標の正の向きとします。

入力される値

H W N   
S_0     
...     
S_(H-1)    
y_1 x_1     
...     
y_N x_N

・ 1 行目には盤面の行数を表す整数 H , 盤面の列数を表す整数 W , 与えられる座標の数を表す整数 N が与えられます。
・ 続く H 行のうち i 行目 (0 ≦ i < H) には、盤面の i 行目の文字をまとめた文字列 S_i が与えられ、S_i の j 文字目は、盤面の i 行目の j 列目に書かれている文字を表します。
・ 続く N 行 には、文字を答えるための y_i , x_i 座標が与えられます。(1 ≦ i ≦ N)

期待する出力

N 行の出力

・ i 行目 (1 ≦ i ≦ N) には、i 番目の座標 y_i, x_i の盤面の文字 A_i を出力してください。

A_1        
...     
A_N
条件
すべてのテストケースにおいて、以下の条件をみたします。

・ 1 ≦ H , W ≦ 20
・ 1 ≦ N ≦ H × W
・ 0 ≦ y_i < H , 0 ≦ x_i < W (0 ≦ i < N)
・ S は W 文字の文字列
・ S の各文字は . または #

入力例1

3 3 2

###

###

...

2 2

1 1

出力例1

.
#

入力例2

2 2 1
#.
.#
0 1

出力例2

.

何が問われているか?(問題の抽象化)

多次元配列の基礎的な操作方法(出力)

解答と解説(入力例1をベースとしています)

#1行目の入力値を受け取りそれぞれの変数に代入
h,w,n = gets.split.map(&:to_i)
ary = []

#盤面の情報を受取り変数に代入する。
h.times.map do
  ary << gets.chomp
end
n.times do |i|
#半角スペース刻みの入力値を受け取り変数に代入
  y,x = gets.split.map(&:to_i)
#入力例1の時ary[2][2]とary[1][1]を取り出したいわけなので
  puts ary[y][x] 
end

問題2:盤面の情報変更 (paizaランク C 相当)

行数 H , 列数 W の盤面があり、各マスには文字が 1 つだけ書かれています。盤面と N 個 の y , x 座標 が与えられるので、盤面の与えられた座標の文字を “#” に書き換えた後の盤面を出力してください。

なお、マスの座標系は左上端のマスの座標を ( y , x ) = ( 0 , 0 ) とし、
下方向が y 座標の正の向き、右方向が x 座標の正の向きとします。

入力される値
H W N   
S_0       
...     
S_(H-1)     
y_1 x_1     
...     
y_N x_N

・ 1 行目には盤面の行数を表す整数 H , 盤面の列数を表す整数 W , 与えられる座標の数を表す整数 N が与えられます。
・ 続く H 行のうち i 行目 (0 ≦ i < H) には、盤面の i 行目の文字をまとめた文字列 S_i が与えられ、 S_i の j 文字目は、盤面の i 行目の j 列目に書かれている文字を表します。(0 ≦ j < W)
・ 続く N 行 には、 文字を書き換えるマスの y , x 座標が与えられます。(1 ≦ i ≦ N)

期待する出力
H 行での出力

・ 書き換えた後の盤面を H 行で出力してください。

T_0       
...     
T_(H-1)
条件
すべてのテストケースにおいて、以下の条件をみたします。

・ 1 ≦ H , W ≦ 20
・ 1 ≦ N ≦ H × W
・ 0 ≦ y < H, 0 ≦ x < W
・ S は W 文字の文字列
・ S の各文字は "." または "#"
入力例1
3 3 1

...

...

...

0 0
出力例1
#..

...

...
入力例2
4 4 2

####

####

....

##..

2 0

2 2
出力例2
####
####
#.#.
##..

何が問われているか?(問題の抽象化)

多次元配列の基礎的な操作方法(置き換え)

解答と解説

途中までは1と同じだけれども、指定した配列のインデックスの場所を#に変える処理を書けば良い

h,w,n = gets.split.map(&:to_i)
ary = h.times.map { gets.chomp }
n.times do |i|
  y,x = gets.split.map(&:to_i)
# ここが違うよ(指定した位置を#に変える)
  ary[y][x] = "#"
end
puts ary

続きます