散弾銃

仕事の不満を書いて忘れ休日の思い出を書き残すブログ

CodeIQのCランク問題に挑戦

プログラミングの実力を判定しましょうってバナー広告に釣られて

久々のコーディングに挑戦してみました。

 

【問題】

「0123456789」の10枚のカードの内、4枚のカードが提示されます。

通常は、「最も数値が大きなカード」が勝利者のカードです。
4枚の中に0があれば、「0以外で最も小さなカード」が勝利者のカードです。

勝利者のカードの数値を割り出してください。

 

以下、15分ぐらいで書いたソースコード

 

import java.util.Scanner;

public class main {

public static void main(String args) {


Scanner scan = new Scanner(System.in);
String num = scan.next();
int max = -1;
int min = 10;
boolean flg = false;
String num2 = num.split("",0);

for(int i = 0;i<4;i++){
int num3;

num3 = Integer.parseInt(num2[i]);
if(num3 == 0){
flg = true;
}
if(max<num3){
max = num3;
}
if(min>num3 && num3 != 0){
min = num3;
}


}

if(flg){
System.out.println(min);
} else {

System.out.println(max);
}

}

}

 

出来てないこと:

①文字列の入力も受け付けてしまう

②入力できる文字数に制限がない(問題だと4ケタ)

③複数行の処理に対応していない

 

解決方法:

①、②:正規表現で受け付ける文字の種類、数に制限をかける

③文字入力をwhile文で回し、4文字の入力を複数回受け付けられるようにする

 

疑問点:

文字列の入力の終了タイミングをどう判定するか(0と一文字入力したら終了、とかで良いのだろうか)

 

正規表現とかほぼ覚えてないけど15分ぐらいで直せないだろうか。

 

 

6/24追記

完成しました。

6/24追記②

赤字の箇所を修正(同じ文字を複数回入力出来ないようにしました)

 

>|java|
import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class main {

public static void main(String[] args) {




boolean flg = false;
boolean flgZero = false;
boolean flgInput = true;
ArrayList<String> input = new ArrayList<String>();

while(flgInput){
Scanner scan = new Scanner(System.in);
String num = scan.next();
Pattern p = Pattern.compile("^\\d{4}$");
Matcher m = p.matcher(num);
String[] inputInt = num.split("",0);


if(m.find()){
for(int i = 0;i<4;i++){
for(int n = 0;n<4;n++){
if(inputInt[i].equals(inputInt[n]) && i!=n){
flg = true;
}
}
}
if(flg){
System.out.println("重複しない数字を入力して下さい。");
flg = false;
} else{
input.add(num);
}
} else if(num.equals("0")){

flgInput = false;
}else{
System.out.println("入力出来る文字は4ケタの半角数字のみです。");
}

}

for(String s:input){
int max = -1;
int min = 10;
String[] inputSplit = s.split("",0);

for(int i = 0;i<4;i++){
int num3;
num3 = Integer.parseInt(inputSplit[i]);

if(num3 == 0){
flgZero = true;
}
if(max<num3){
max = num3;
}
if(min>num3 && num3 != 0){
min = num3;
}

}
if(flgZero){
System.out.println(min);
} else {

System.out.println(max);

}

}


}

}





||<

 

インデントが消滅して見づらいけど、

①正規表現による文字の属性・桁数チェック

②複数行の入力への対応

 

が出来ました。

入力受付は0と打ったら終了します。指定されてないしいいでしょ。

 

以上