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

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

ただいまの
回答率

90.53%

  • Java

    13740questions

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

javaの標準入力について

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 236

yuki8

score 3

このような

絵の具の色をいくつ作れるかのプログラムです。
上部分(4から)が必要な色と個数で下部分(2から)は所持している色と個数です。これを入力した際に目的の色をいくつ作れるかを表示するプログラムです。

例えば
n
iro kazu

条件
n < 100
kazu < 10000

入力例
2
ao 3
midori 3

4
ao 20
aka 2
midori 13
kiiro 1

と入力した際に

出力例
4

と表示したいのですが、最初と5行目に出てきている 1つの数字(おそらくその後の入力行数)が邪魔で
うまく変数に値を入れることができません
どのようにすればよいでしょうか? 入力例の入力行数は毎回変わるもとなります
例:
3
ao 3
aka 2
midori3
2
ao 1
midori1
など

        String line1 = sc.nextLine();

        int n = Integer.parseInt(line1);

        String [] resipi;

        //初期値
         resipi = new String[2];


        //入力個数まで
            for(int i = 0; i < n; i++){
                String line2 = sc.nextLine();
                resipi = line2.split(" ");
            }

こうすると最初の4つは取り出せました。

試したこと
読み込んだ行が数値か数値でないかを判断しループをすることを考えましたが、コードに起こせませんでした。

ご回答よろしくお願いします。

追記
上のプログラムの結果が4になるのは
青を20こ緑を13こ持っていて 青3 緑3ずつ使うと
青は足りても緑は4個目を作った時点で足りなくなるので 結果作れる個数は4となります。

現在のわからない部分として
値をそれぞれの配列に入れたあと比べる際にどのように比べて作れるかずを求めるかという部分がいまいち想像がつきません。要素番号も同じわけではないので単純な方法ではできませんし

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • unz.hori

    2018/04/12 16:57

    例えばという例でみると必要な色にmidori, kiiroがあるのに結果が4になるのは何故ですか?

    キャンセル

  • unz.hori

    2018/04/12 16:57 編集

    追記されているようですがやっぱり理解できないや。必要な色が赤と黄色があるのに作れる色が4になる...

    キャンセル

  • yuki8

    2018/04/12 16:59

    逆でしたすみません

    キャンセル

回答 3

checkベストアンサー

0

こんにちは,まず初めに

最初と5行目に出てきている 1つの数字(おそらくその後の入力行数)が邪魔で
うまく変数に値を入れることができません

邪魔ではありません。これらの数字がaoやmidoriなどのデータを格納する配列の要素数となり、
宣言の時 利用します。むしろなかったら難易度が上がるでしょう。

とりあえず、入力のところだけソースを書きました。
私は 色の名前のところとその数のところを別々に分けました。(Stringとint)
(ちゃんとデータが格納されたか確認するため最後文字出力しています。)

ただ、いざ問題を解こうとしたときに問題の意味が微妙にわからないところがあって解けません。

4
ao 3
aka 2
midori 3
kiiro 1
2
ao 20
midori 13 
と入力した際に 
出力例

なぜ,答えが4になるのかがわからなくて問題を解くにも解けません.
すみませんがもう少し詳しく説明していただけませんか?
よろしくお願いします。

<追記>
問題の意味が分かったので私か書いたソース(一番下にある)の説明をしたいと思います。

String []color = new String[n];
int []color_num = new int[n];
String []color2 = new String[m];
int []color2_num = new int[m];

上から順に必要な色の 名前・個数
所持している色の 名前・個数
となります。

for(int i = 0; i < n; i++){
    for(int j = 0; j < m; j++){
        if(color[i].equals(color2[j])){
           array.add(color2_num[j] / color_num[i]);
        }
    }
}


これはn個の色の名前を一つずつ m個の所持している色と名称が同じかどうかチェックしています。
同じなら(例えば質問欄にあったaoにしましょう.)所持している個数(今回は20個)と
必要な個数(今回は3個)で20 / 3 = 6組できます。
この操作をfor文で全通りやります。それぞれの色が何組できるかListに格納しましょう。

Collections.sort(array);


これを使うとListに格納したデータを昇順にソートすることができます。
昇順にソートすると最小値が一番最初 つまり0番目に来ます。
この0番目を結果として表示すれば完了です!!

以上 

私が書いたソースコードを載せます。

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;

public class Main{
    public static void main(String[] args){

         Scanner sc = new Scanner(System.in);
         String line = sc.nextLine();
         int n = Integer.parseInt(line);
         String []color = new String[n];
         int []color_num = new int[n];
         for(int i = 0; i < n; i++){
             line = sc.nextLine();
             String []resultArray = line.split(" ");
             color[i] = resultArray[0];
             color_num[i] = Integer.parseInt(resultArray[1]);

         }
         line = sc.nextLine();
         int m = Integer.parseInt(line);
         String []color2 = new String[m];
         int []color2_num = new int[m];

         for(int i = 0; i < m ; i++){
             line = sc.nextLine();
             String []resultArray = line.split(" ");
             color2[i] = resultArray[0];
             color2_num[i] = Integer.parseInt(resultArray[1]);
         }
         ArrayList<Integer> array = new ArrayList<>();
         for(int i = 0; i < n; i++){
             for(int j = 0; j < m; j++){
                 if(color[i].equals(color2[j])){
                     array.add(color2_num[j] / color_num[i]);
                 }
             }
         }
         Collections.sort(array);
         System.out.println(array.get(0));
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/12 16:57

    追記をご確認ください。

    キャンセル

  • 2018/04/12 17:07

    理解できました。ありがとうございます。書けそうです。

    キャンセル

  • 2018/04/12 17:20

    比べる際の比べ方がわからなかったです。
    例えば ao はaoで個数を比べて割った余りを返せばいいと思うんですが配列の要素番号も同じわけではないですし、特定文字があるか判定するためのArrays.asListでは無理ですよね?

    キャンセル

  • 2018/04/12 17:50

    なるほど そういうことですね つまり ao 20 midori 13 を持っているに対して
    必要なのは ao 3 midori 3 より 求める答えは 20/3と13/3の「最小値」の4ということになります。

    キャンセル

  • 2018/04/12 17:51

    やるべきことが分かったので実際にソースコードを書きたいと思います。

    キャンセル

  • 2018/04/13 13:04

    ありがとうございます。無事動きました。

    キャンセル

  • 2018/04/13 15:21

    今回のような データの個数・実際のデータ を入力するものは説明した通りの方法でできます。
    今回はデータが2つで文字列 変数といった型の異なるものだったので分けましたが
    型が同じなら2次配列でできます。その時もline.split("")で分けましょう。

    キャンセル

  • 2018/04/16 17:28

    ありがとうございます。もっと柔軟に考えてみたいと思います。

    キャンセル

0

いろいろ気になることが多いのですが、とりあえず質問点だけ答えます。
同じことを二回書けばいいです。

int n = Integer.parseInt(sc.nextLine());
for(int i = 0; i < n; ++i) {
    一行読み取り;
}

int m = Integer.parseInt(sc.nextLine());
for(int i = 0; i < m; ++m) {
    一行読み取り;
}

ループの挙動が分かっていれば、これで入力が捌けることは理解できるかと。


他に気になる点については、理解度が把握でき次第追記します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/12 17:02

    理解できました、そこに関しては難しく考えすぎていたようです。ありがとうございます。

    キャンセル

  • 2018/04/12 17:04

    ところで、この問題はどこかのサイトのものでしょうか?
    その場合は引用元を示した方が良いかと思います。

    キャンセル

  • 2018/04/12 17:05

    著作権の関係上問題の条件自体やコードをこちらで変えています。すみません

    キャンセル

  • 2018/04/12 17:11

    引用元を明記すれば認められる範囲かと思いますが、いかがでしょう。
    『もしかしたら宿題なんじゃないか?』という疑念も振り払えますし。

    キャンセル

  • 2018/04/12 17:17

    赤字で書かれてるので無理かと思います。

    キャンセル

  • 2018/04/12 17:55

    引用の原本と経緯が分かりませんので、これ以上詳しい回答は差し控えさせていただきます。
    最後にヒントだけ。連想配列で色とその本数を管理すると楽です。

    キャンセル

  • 2018/04/13 10:24

    内容はかなり変えて一部分のみなので著作権等には触れないよう意識しております。そのせいで辻づま合わない部分が出てきてますが。

    キャンセル

0

宿題だとしたら、本当は回答者の方のヒントを元に試行錯誤して欲しいところです。
とりあえず私のコードを回答しておきます。(あくまで参考として理解してください。コピペはだめですよ)
※.エラー処理などは全く考慮していません。
※.コメント部分(System.out)は途中経過を出力したものでロジックに関係ありません。

package answer.of.taratail;

import java.util.HashMap;
import java.util.Scanner;

public class ScannerTest2 {

    public static void main(String[] args) {

        // Scanner生成
        Scanner sc = new Scanner(System.in);

        // 必要色情報(key:色名、value:数)
        HashMap<String, Integer> needColors = new HashMap<String, Integer>();
        // 所持色情報(key:色名、value:数)
        HashMap<String, Integer> haveColors = new HashMap<String, Integer>();
        // 入力パラメータ分割用
        String inputParam[];

        // 必要色数
        String readLine = sc.nextLine();
        Integer needColorNum = Integer.parseInt(readLine);

        // 必要色情報取得
        for(int i = 0; i < needColorNum; i++){
            readLine = sc.nextLine();
            inputParam = readLine.split(" ");
            String key = inputParam[0];
            Integer value = Integer.parseInt(inputParam[1]);
            needColors.put(key, value);
        }

        // 所持色数
        readLine = sc.nextLine();
        Integer haveColorNum = Integer.parseInt(readLine);

        // 所持色情報取得
        for(int i = 0; i < haveColorNum; i++){
            readLine = sc.nextLine();
            inputParam = readLine.split(" ");
            haveColors.put(inputParam[0], Integer.parseInt(inputParam[1]));
        }

        // 作成可能な色数を計算
        int minMakeColorNum = 0;
        for(String key : haveColors.keySet()) {
            needColorNum = needColors.get(key);
//            System.out.println("key:" + key + ", value:" + needColorNum);
            if (needColorNum != null) {
                // 色名が一致した場合のみ計算ロジックに入る
//                System.out.println("key:" + key + ", have:" + haveColors.get(key) + ", need:" + needColorNum);
                int makeColorNum = haveColors.get(key) / needColorNum;
                if (minMakeColorNum == 0) {
                    // 初期値のままであれば計算値を代入
                    minMakeColorNum = makeColorNum;
                }
//                System.out.println("makeMinColorNum:" + makeColorNum);
                if (minMakeColorNum > makeColorNum) {
                    // 最小値が作成可能な色数となるので代入
                    minMakeColorNum = makeColorNum;
                }
            }
        }

        System.out.println("作成可能な色数:" + minMakeColorNum);
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/13 10:22

    宿題ということは学校のでしょうか?試せることは全て試し自分の考えでは比較部分ができないので質問致しました。

    キャンセル

  • 2018/04/13 10:44

    まぁ、まずはJavaの基本APIを調べるというか理解することでしょうね。だいたいこんなクラス、メソッドないかなぁってのはあるはずなので。他の回答者の方が"連想配列"というヒントをくださってるんで"Java 連想配列"とかでググるとかできることはまだまだあるはずですね。宿題かどうかというのは単にこういうQ&Aサイトに宿題の問題を載せて回答を得てそれをコピペして提出する輩がいるからの懸念です。

    キャンセル

  • 2018/04/13 13:05

    誰かに出された宿題というよりはサイトを見て出題された問題を解く勉強ですね。ご回答いただきありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13740questions

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