質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

2172閲覧

五目並べ(縦)の問題について

liataretail

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/09/18 09:47

前提・実現したいこと

5行5列の五目並べの盤面が与えられます。
盤面の各マスには、"O"か"X"か"."が書かれています。
"O"と"X"は、それぞれプレイヤーの記号を表します。
同じ記号が縦に連続で5つ並んでいれば、その記号のプレイヤーが勝者となります。
勝者の記号を1行で表示してください。
勝者がいない場合は、引き分けとして、"D"を表示してください。

発生している問題・エラーメッセージ

解答のソースコードを読んだのですが、
for (int i = 0; i < 5; i++) {
board[i] = scanner.next().split("");
}

の部分が理解できませんでした。これは次のfor文の中に組み込んでしまっては駄目なのでしょうか。

該当のソースコード

Java

1import java.util.*; 2 3 4public class Main { 5 public static void main(String[] args) { 6 Scanner scanner = new Scanner(System.in); 7 String[][] board = new String[5][5]; 8 String result = "D"; 9 10 for (int i = 0; i < 5; i++) { 11 board[i] = scanner.next().split(""); 12 } 13 14 for (int i = 0; i < 5; i++) { 15 String line = ""; 16 for (int j = 0; j < 5; j++) { 17 line += board[j][i]; 18 } 19 20 if (line.equals("OOOOO")) { 21 result = "O"; 22 } else if (line.equals("XXXXX")) { 23 result = "X"; 24 } 25 } 26 27 System.out.println(result); 28 scanner.close(); 29 } 30}

試したこと

board[i] = scanner.next().split("");を
次のfor文の中に組み込んだ

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/09/18 09:54

>次のfor文の中に組み込んだ 結果どうだったのでしょう。 1つのゴールに向かうルートは1つではないので「こうでなければいけない」というのはありません。 あくまで解答「例」です。 要件通りに動作し、不具合がなければそれら全て(よほどパフォーマンスに影響のある作りでない限り)正解と言えます。
liataretail

2021/09/18 10:08

OO..O .OOXO OO.X. OOO.O XO..O を入力した際にDが出力され、誤りとなりました。 そもそも解答例のコード自体があまり理解できていません、、、
liataretail

2021/09/18 10:26

for (int i = 0; i < 5; i++) { board[i] = scanner.next().split(""); } この部分は、入力された5文字の文字列1行を、1文字ずつboardの配列に入れているという認識であっていますか? また、for (int j = 0; j < 5; j++) { line += board[j][i]; } この部分でjとiが逆転していることも理解できませんでした。
jimbe

2021/09/18 10:51 編集

> ~ 駄目なのでしょうか > ~ 誤りとなりました つまりダメということです。 > コード自体があまり理解できていません ならばその理解がまず先でしょう。 全体がハッキリしないのに部分をどうにかしようとしてもトライアンドエラーにしかなりません。 プログラムを理解する方法としまして、仕様からの他に、動作からという方法もあります。 使用されている各メソッドの仕様を調べる他、System.out.println() を随所に入れて変数の変化を追ってみることも理解の助けになると思います。
m.ts10806

2021/09/18 11:17

質問は編集できます。 適宜追記してください。
BeatStar

2021/09/18 11:29

まず、出典元を書きましょう。 (なんとなくPaizaかAtCoderぽい気がする) Paizaスキルチェックの場合、答え等を聞いたりアップしたりすること自体が規約違反です。 (模範回答があるから違うか?) AtCoderでも時期によってはダメみたいですし。 それに、別の条件が隠されている可能性もあるので。
liataretail

2021/09/18 14:52

解答できないのであればいちいち書き込まなくて大丈夫ですよ。説教を求めているわけではないので。
liataretail

2021/09/21 11:22

そんなこと書いてる暇があるなら解説の1つでも記述したら良いのではないでしょうか
guest

回答1

0

ベストアンサー

最初の for は盤面の碁石の値を、board[行][列]にセットするところです。

次の for は盤面の碁石の状態を読んで、縦(同じ列)に5個並んでいるかをチェックしています。

ここで、2つめのforに1つめのforを組み込んでも動きません。

もし、2つ目のforに組み込むと、まず、1行目のみ碁盤の状態がセットされます。その状態で、1列目を縦にチェックしていきますが、2行目以降は碁盤の状態が読み込まれていない状態でチェックにいくことになり、出力は不確定なものとなります。

最初の for は、2番目のループで使う変数と揃えるならば、本来、i ではなく j と書くべきところなのです。最初のループの i を j に変えて頂くと、なぜ動かないか分かると思います。

投稿2021/09/18 15:06

ak.n

総合スコア291

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ak.n

2021/09/18 15:19

補足します。 最初のループで board は二次元配列なのに、なぜ1次元配列に代入しているのか? とお思いになったことと思います。 これは、board[行]にその行の1列目~5列目までの1次元配列を代入するイメージになります。 splitというのは、文字列を分解して、その1次元配列を作り出してくれるメソッドとお考えください。 splitメソッドをお調べください。私は java は全く書かないのでよくわかりませんが、まあ、このコードで動くということは、"" で区切ると1文字ずつ区切って配列にしてくれるんだろうと勝手に思っています。
liataretail

2021/09/18 15:36

ご回答ありがとうございます。 splitで区切ることで、ある行の1~5列目までの一次元配列を代入することは理解できました。 しかし、行数は5行あることから、この動作を5回繰り返す必要はないのでしょうか?
ak.n

2021/09/18 15:42

これはプログラミングではすごく大事なことなのですが、まず5×5のマスを紙に書いて、board[0][0],board[0][1],board[0][2]…board[0][4],board[1][0]………,board[4][4]ですね、これが「どのマスを表すことにしてプログラムしようとしているか」をイメージしてからプログラムを書かないと、詰まってしまうと思います。 「どのマスを表しているか」ではなく「どのマスを表そうとしているか」です。ここ案外重要だったりします。自分でどう定義するかという話なので、別に、行列逆でもいいんです。 プロは慣れてるので書きませんが、強く頭のなかでイメージして作っています。
ak.n

2021/09/18 15:47

はい、おっしゃる通りです。5回繰り返す必要があるので、 ```java for (int i = 0; i < 5; i++) { board[i] = scanner.next().split(""); } ``` で5行読み込んでいます。
liataretail

2021/09/18 15:48

大変分かりやすい説明のおかげで理解できました。心から感謝いたします。 ろくに解答もせず初心者相手に説教し、悦に入ることしかできない他の回答者と比べ、素晴らしい回答者様でした。
ak.n

2021/09/18 15:49

i=0 で 1行目を読み込みます i=1 で 2行目を読み込みます i=2 で 3行目を読み込みます i=3 で 4行目を読み込みます i=4 で 5行目を読み込みます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問