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と打ったら終了します。指定されてないしいいでしょ。
以上