今回は 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` 行、順番通り
- ポイント
- 配列のインデックスずれに注意