今回は paiza の「【マップの扱い 1】マップの書き換え・1 マス」の問題に挑戦!
これからまた、新しいテーマの問題を解いていく!
問題概要
◯ 入力
- 行数
H、列数W -
H行の盤面 - 書き換える座標 (y, x)
◯ 処理
- 指定された (
y,x) のマスを「.⇔#」に反転する
◯ 出力
- 書き換え後の盤面を
H行出力
入力例:
3 3
...
...
...
0 0
出力例:
#..
...
...
✅ OK例:
const rl = require('readline').createInterface({ input:process.stdin });
const lines = [];
rl.on('line', (input) => lines.push(input));
rl.on('close', () => {
const [H, W] = lines[0].split(' ').map(Number);
const [y, x] = lines[H+1].split(' ').map(Number);
// 盤面を2次元配列に変換
const map = lines.slice(1, H+1).map(line => line.split(''));
// 指定座標の反転処理
if (map[y][x] === '.') {
map[y][x] = '#';
} else if (map[y][x] === '#') {
map[y][x] = '.';
}
// 出力
map.forEach(m => console.log(m.join('')));
});
if-else でも良いけど、三項演算子で短く書ける:
map[y][x] = map[y][x] === '.' ? '#' : '.';
🗒️ ポイント
◯ 盤面を2次元配列に変換する
- 文字列のままだと1文字だけ置き換えができない。
-
.map(line => line.split''))で配列にすればmap[y][x]のように直接アクセス・更新できる。
◯ 三項演算子で反転処理を短く書ける
-
if-elseでもOKだが、条件がシンプルなので三項演算子が向いている。