このような
絵の具の色をいくつ作れるかのプログラムです。
上部分(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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
こんにちは,まず初めに
最初と5行目に出てきている 1つの数字(おそらくその後の入力行数)が邪魔で
うまく変数に値を入れることができません
邪魔ではありません。これらの数字がaoやmidoriなどのデータを格納する配列の要素数となり、
宣言の時 利用します。むしろなかったら難易度が上がるでしょう。
とりあえず、入力のところだけソースを書きました。
私は 色の名前のところとその数のところを別々に分けました。(Stringとint)
(ちゃんとデータが格納されたか確認するため最後文字出力しています。)
ただ、いざ問題を解こうとしたときに問題の意味が微妙にわからないところがあって解けません。
4
ao 3
aka 2
midori 3
kiiro 1
2
ao 20
midori 13
と入力した際に
出力例
4
なぜ,答えが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));
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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) {
一行読み取り;
}
ループの挙動が分かっていれば、これで入力が捌けることは理解できるかと。
他に気になる点については、理解度が把握でき次第追記します。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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);
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 90.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
coco_bauer
2018/04/12 16:40
splitした結果の配列の長さ(要素数)が1なら1つの値(数値)、2なら文字列(色)と整数(個数)のペア、と判断できるのではないですか
unz.hori
2018/04/12 16:42
resipiの型は何でしょうか?
yuki8
2018/04/12 16:43
判断部分に関しては色々方法があると思うのですが、問題は入力値を上と下で比べる方法(今の上の方法ではおそらく無理かと思います)がわからずコードが書けない状態です。
unz.hori
2018/04/12 16:48
入力値を全て取得できたとして、結果をどうしたいのかが良く分かりませんね。
yuki8
2018/04/12 16:50
目的の色をいくつ作れるかを表示するプログラムです。
unz.hori
2018/04/12 16:52
色名の後の数値は何を意味しますか?
yuki8
2018/04/12 16:54
ao 3 は色 個数 です
unz.hori
2018/04/12 16:57
例えばという例でみると必要な色にmidori, kiiroがあるのに結果が4になるのは何故ですか?
unz.hori
2018/04/12 16:57 編集
追記されているようですがやっぱり理解できないや。必要な色が赤と黄色があるのに作れる色が4になる...
yuki8
2018/04/12 16:59
逆でしたすみません