たいちっち

競技プログラミングをしています

【Java】文字列のfor文(B - OddString)

解いた問題

AtCoderの「B - OddString」

提出した回答
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String S = sc.next();
        sc.close();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < S.length(); i++) {
            if (i % 2 == 0) {
                sb.append(S.charAt(i));
            }
        }
        System.out.println(sb);
    }
}

奇数文字列目を抜き出す。"0”スタートにして、2で割った余りが"0"になるよう設定した。

TODO
  • 他のA,B問題を解く

 

おわり。。

【Java】値にindexを持たせて格納する(B - Palace)

解いた問題

AtCoderの「B - Palace」

提出した回答
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int T = sc.nextInt();
        int A = sc.nextInt();
        Map<Integer, Double> map = new HashMap<>();//index,Aとの気温差
        int minKey = 0;
        double minValue = 0;
        for (int i = 1; i <= N; i++) {
            map.put(i, Math.abs((T - sc.nextInt() * 0.006) - A ));
            if (i == 1) {
                minKey = 1;
                minValue = map.get(1);
                continue;
            }
            if (map.get(i) < minValue) {
                minKey = i;
                minValue = map.get(i);
            }
        }
        System.out.println(minKey);
        sc.close();
    }
}

「地点の番号を出力する」ため、for文でindexを格納する必要があった。Listでは出来ない(思いついていない)ので、HashMapを使った。

for文の「i」(index)と入力された値をセットで格納している。
値は、問題通りの計算に加え、Aとの絶対値を計算してから格納している。

あとは各「i」の値で「i-1」の値と比べ、小さい値(Aと近い値)を採用する。

TODO
  • 他のA,B問題を解く

 

おわり。。

 

【Java】数値比較(B - Maximum Difference)

解いた問題

AtCoderの「B - Maximum Difference」

提出した回答
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int min = 0;
        int max = 0;
        for (int i = 0; i < N; i++) {
            int tmp = sc.nextInt();
            if (i == 0) {
                min = tmp;
                max = tmp;
            }
            if (tmp < min) {
                min = tmp;
            }
            if (max < tmp) {
                max = tmp;
            }
        }
        System.out.println(max - min);
        sc.close();
    }
}

初めはListに入れることを考えたが、最小値・最大値を保持して差を取れば良いことに気づいたので、for文を1度回して値を確認した。

TODO
  • 他のA,B問題を解く

 

おわり。。

 

【Java】全探索(B - Break Number)

解いた問題

AtCoderの「B - Break Number」

提出した回答
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        sc.close();

        int result = 1; //出力する値
        int counter_max = 0; //2で割れる回数が1番多いときの値

        for (int i = 1; i <= N; i++) {
            int counter_current = 0; //現在のiが2で割れる回数
            boolean flag = true;
            int tmp = i;
            while (flag) {
                if (tmp % 2 == 0) {
                    tmp /= 2;
                    counter_current += 1;
                } else {
                    flag = false;
                }
            }
            if (counter_max < counter_current) {
                counter_max = counter_current;
                result = i;
            }
        }
            System.out.println(result);
    }
}

全探索で解いた。
2で割れる回数をカウントして、より2で割れる回数が多いものを採用している。

方法は思いついていないが、途中のwhile文を無くしてすっきりさせたい。

TODO
  • 他のA,B問題を解く

 

おわり。。

【Java】辞書順に並べ替え(B - Two Anagrams)

解いた問題

AtCoderの「B - Two Anagrams」

提出した回答
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        String t = sc.next();
        sc.close();
        //s_dash
        char[] s_stringToCharArray = s.toCharArray();
        Arrays.sort(s_stringToCharArray);
        String s_dash = String.valueOf(s_stringToCharArray);
        //t_dash
        char[] t_stringToCharArray = t.toCharArray();
        Arrays.sort(t_stringToCharArray);
        StringBuilder t_dash = new StringBuilder();
        //降順に追加していく
        for (int i = t_stringToCharArray.length -1 ; 0 <= i; i--) {
            t_dash.append(t_stringToCharArray[i]);
        }
        //比較
        if (s_dash.compareTo(String.valueOf(t_dash)) < 0) {
            System.out.println("Yes");
        } else {
            System.out.println("No");
        }
    }
}
  • sの各文字を辞書順に昇順に並び替えた文字列(最も辞書順が早いs)
  • tの各文字を辞書順に降順に並び替えた文字列(最も辞書順が遅いt)

を比較する方針で書いた。

文字列の辞書順の比較はcompareToメソッドを使用した。

2つの文字列を辞書的に比較します。比較は文字列内のそれぞれの文字のUnicode値に基づいて行われます。このStringオブジェクトによって表される文字シーケンスが、引数文字列によって表される文字シーケンスと辞書的に比較されます。このStringオブジェクトが辞書的に引数文字列より前にある場合は、結果は負の整数になります。このStringオブジェクトが辞書的に引数文字列の後ろにある場合、結果は正の整数になります。それらの文字列が等しい場合、結果はゼロになります。compareToから0が返されるのは、equals(Object)メソッドからtrueが返される場合だけです。

戻り値:
引数文字列がこの文字列に等しい場合は、値0。この文字列が文字列引数より辞書式に小さい場合は、0より小さい値。この文字列が文字列引数より辞書式に大きい場合は、0より大きい値。

つまり、「文字列A」.compareTo(「文字列B」)とすると

  • 戻り値 < 0 :文字列Aが文字列Bより辞書順で先
  • 戻り値 = 0 :文字列Aと文字列Bが辞書順で等しい
  • 戻り値 > 0 :文字列Aが文字列Bより辞書順で後

となる。

今回与えられる文字列は英小文字のみなのでcompareToで良いが、もし大文字も含まれるならcompareToIgnoreCaseを使用すると良さそう。

大文字と小文字の区別なしで、2つの文字列を辞書的に比較します。このメソッドは、文字列の正規化バージョンでcompareToを呼び出して得られた符号を持つ整数を返します。ここでは、各文字でCharacter.toLowerCase(Character.toUpperCase(character))を呼び出すことで大文字と小文字の違いがなくなります。

TODO
  • 他のA,B問題を解く

 

おわり。。

 

【Java】文字の連結(B - i18n)

解いた問題

AtCoderの「B - i18n

提出した回答1
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String S = sc.next();
        sc.close();
        String start = String.valueOf(S.charAt(0));
        String end = String.valueOf(S.charAt(S.length() -1));
        String inner = String.valueOf(S.length()-2);
        System.out.println(start + inner + end);
    }
}

valueOf(char c)・valueOf(int i)で、文字列表現を返す。
強引なやり方な気がする。

実行時間は103msだった。

提出した回答2
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String S = sc.next();
        sc.close();

        StringBuilder sb = new StringBuilder();
        sb.append(S.charAt(0)).append(S.length()-2).append(S.charAt(S.length()-1));
        System.out.println(sb);

    }
}

StringBuilderを作成して、それに1つずつ追加する。

実行時間は98msだった。

TODO
  • 他のA,B問題を解く

 

おわり。。

【Java】文字列の置換(A - Already 2018)

解いた問題

AtCoderの「A - Already 2018」

提出した回答
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String S = sc.next();
        System.out.println(S.replace("2017/01/", "2018/01/"));
    }
}

シンプルに置換した。

問題に「2017/01」までは必ず入力されるとあるので、できる限り長い文字列を置換するようにした。

 

StringBuilderクラスを使い、文字列を渡し「setCharAt」を使っても良さそう。

TODO
  • 他のA,B問題を解く

 

おわり。。