今回は paizaの「神経衰弱を解くために:part3」の問題に挑戦!
問題概要
〇 盤面情報
-
H行 ×W列のカードのグリッドがある - 各カードには数字 1~13 が書かれており、同じ数字は 2 枚または 4 枚存在する
- 例: 4×3 のグリッドなら 12 枚カードが並ぶ
〇 プレイヤー情報
-
N人でゲームを行う - 実際のプレイヤー操作は不要(今回は入力として誰がめくったかは関係なし)
〇 操作記録
-
L回の操作(カードを 2 枚めくる)を時系列順に受け取る - 1 回の操作は (
a_i,b_i,A_i,B_i) で表され、a_i行b_i列と、A_i行B_i列のカードがめくられたことを示す - 行・列は 1 始まり
〇 出力
- 各操作ごとに、めくった 2 枚の数字が同じなら
YES、違うならNO -
L行の出力
入力例:
4 3 2
5 7 8
12 9 8
5 9 8
7 12 8
4
1 3 4 1
1 3 3 3
1 1 1 2
1 2 2 2
出力例:
NO
YES
NO
NO
✅OK例:
const rl = require('readline').createInterface({ input:process.stdin });
const lines = [];
rl.on('line', (input) => lines.push(input));
rl.on('close', () => {
const [H, W, N] = lines[0].split(' ').map(Number);
const cardsGrid = lines.slice(1, H+1).map(line => line.split(' ').map(Number));
const L = lines[H+1];
const logs = lines.slice(H+2).map(line => line.split(' ').map(Number));
for (let i = 0; i < L; i++) {
const [a, b, A, B] = logs[i];
if (cardsGrid[a-1][b-1] === cardsGrid[A-1][B-1]) {
console.log('YES');
} else {
console.log('NO');
}
}
});
- 初期情報の取得
-
lines[0]からH(行数)、W(列数)、N(プレイヤー数)を取得
-
- カード盤面の格納
-
lines[1]からlines[H]までを 2 次元配列cardsGridに変換 - 各要素を数値に変換 (
map(Number))
-
- 操作ログの取得
-
lines[H+1]でL(操作回数)を取得 -
lines[H+2]以降をlogs配列に変換 - 各行を数値配列
[a,b,A,B]に変換
-
- 操作ログの処理
-
L回ループして、各操作[a,b,A,B]を取得 - 対応するカードを
cardsGrid[a-1][b-1]とcardsGrid[A-1][B-1]で比較
-
- 結果出力
- 数字が同じなら
YES、違うならNOをコンソール出力 - 順番通りに
L行出力
- 数字が同じなら
入力例:
4 3 2 // H=4, W=3, N=2
5 7 8
12 9 8
5 9 8
7 12 8
4 // L=4
1 3 4 1
1 3 3 3
1 1 1 2
1 2 2 2
cardsGrid :
[
[5, 7, 8],
[12,9,8],
[5, 9, 8],
[7,12,8]
]
- 1回目 (1,3,4,1) → 1行3列は
8、4行1列は7→NO - 2回目 (1,3,3,3) → 1行3列は
8、3行3列は8→YES - 3回目 (1,1,1,2) → 1行1列は
5、1行2列は7→NO - 4回目 (1,2,2,2) → 1行2列は
7、2行2列は9→NO
📝まとめ
- 配列の使い方
- 入力は 2 次元配列
cardsGrid[row][col]に格納 - 行・列のインデックスが 1 始まりなので、参照時は
-1する
- 入力は 2 次元配列
- ログ処理
- 各ログ
[a,b,A,B]で対応するカードを比較 -
===で同じならYES、違えばNO
- 各ログ
- 出力ルール - 出力は `L` 行、順番通り
- ポイント
- 配列のインデックスずれに注意