iris

Java で AtCoder やってみる


問題集解いてばかりもあれだったので、久しぶりに AtCoder やりました.

久しぶりすぎて問題がどこにあるか分からず Beginners Selection を見つけたのでそれをやりました

ABC083B までやりその内 2問だけ振り返ります

ABC081B

指定された数の正の整数がすべて偶数のとき、それらの整数を2で割る操作が何回実行可能か答える問題です.

1つでも割り切れない値が出た時点で再帰を中断し、実行回数を表示するようにしています.

別の方の解答を見たら、2で何回割り切れるかは2進数で表した際の最下位から続く0の数で判別できると知り、なるほど!と思いました

import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
List<Integer> b = new ArrayList<>();

        for (int i = 0; i < a; i++) {
            b.add(sc.nextInt());
        }
        System.out.println(c(0, a, b));
    }

    private static int c(int cnt, int a, List<Integer> b) {
        List<Integer> c = new ArrayList<>();
        for (int j : b) {
            if (j % 2 == 0) {
                c.add(j/2);
            } else {
                break;
            }
        }

        if (c.size() == a) {
            return c(++cnt, a, c);
        }
        return cnt;
    }
}

資格観点だと配列と動的配列を使い分けようと考えましたが、再帰の終了条件を配列のサイズに基づいて判断するようにしたため、固定長の配列ではなく、サイズが変わる動的配列を使用することにしました、、

ABC083B

1からNまでの整数に対して、各桁の合計がA以上B以下の整数の合計を求める問題です

while文の所で、現在の値の最下位桁の数値を加算し c /= 10 で桁を左にずらしてます現在の値の格桁の合計が A以上B以下であれば、最終的な合計に加算しています

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

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

        int result = 0;

        for (int i = 1; i <= n; i++) {
            int c = i;
            int sum = 0;
            while (c > 0) {
                sum += c % 10;
                c /= 10;
            }
            if (sum >= a && sum <= b) {
                result+=i;
            }
        }

        System.out.println(result);
    }
}

久しぶりにやると難しいけど解けると楽しいですね. 黒本17 届いたので進めないと… 3章まで終わったので明日 4章から..