競技プログラミングの初心者が最初に解くべき問題である「AtCoder Beginners Selection」をjavaで解いてみました。
前回の記事同様、こちらを参考にさせていただきました。
各問についてのソースコードもC++ではありますが、キーポイントを含めて記述してくれているため、とても分かりやすかったです。
※1問目とPractice問題は簡単な四則演算のため、飛ばさせていただきました。
第2問 ABC081A - Placing Marbles
いくつか問題を解いて、どういう筋道で答えを導き出すかをメモベースでいいから先に書いておくと考えがまとまりやすいことに気が付きました。
[メモ]
入力:0と1からなる3桁の数値
出力:1がいくつ存在するか
- 入力データを変数に格納
- 文字列を走査し、1が存在する場合カウンタをインクリメントする
Main.java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int count = 0;
String s = sc.next();
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i) == '1') {
count++;
}
}
System.out.println(count);
}
}
第3問 ABC081B - Shift only
[メモ]
入力:整数の個数(N), N個の整数
出力:N個の整数すべてを何回2で割ることができるか
- 入力データを変数に格納
- N個の整数内を走査する
- N個の整数すべてが、偶数であるか判定
- 全て偶数の場合:カウンタをインクリメントし、整数すべてを2で割る
- 奇数が一つでも存在する場合:繰り返し処理を抜ける
- カウント数を出力
Main.java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int count = 0;
int N = scan.nextInt();
int[] A = new int[210];
for (int i = 0; i < N; i++) {
A[i] = scan.nextInt();
}
while (true) {
boolean existOdd = false;
// 奇数の場合は、フラグを立てる
for (int a : A) {
if (a % 2 == 1) {
existOdd = true;
}
}
if (existOdd) break;
for (int i = 0; i < N; i++) {
A[i] = A[i] / 2;
}
count++;
}
System.out.println(count);
scan.close();
}
}
第4問 ABC087B - Coins
[メモ]
入力:500円玉、100円玉、50円玉それぞれの枚数, 合計金額
出力:入力で受け取った合計金額にするために何通りの方法があるか
ここは、自分では何度やってもいい方法が思い浮かばなかったため、C++の解説を見て参考にしました。
解説を見ると「こんな単純なことか」と思いますが、自分で思いつくのは難しいですよね。
Main.java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int A = scan.nextInt();
int B = scan.nextInt();
int C = scan.nextInt();
int X = scan.nextInt();
int count = 0;
for (int a = 0; a <= A; a++) {
for (int b = 0; b <= A; b++) {
for (int c = 0; c <= A; c++) {
int total = 500*a + 100*b + 50*c;
if (X == total) {
++count;
}
}
}
}
System.out.println(count);
scan.close();
}
}
第5問 ABC083B - Some Sums
この辺からメモをソースコード内にとるようにしました。
Main.java
import java.util.Scanner;
public class Main {
// 1~Nまで数値を走査する
// 各桁の総和を求める
// 総和がA以上B以下であるか判定する
// 真の場合、合計する
public static int func(int n) {
int sum = 0;
while (n > 0) {
// 10で割った余りを合計し、商をnにセットする
sum += n % 10;
n /= 10;
}
return sum;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int N = scan.nextInt();
int A = scan.nextInt();
int B = scan.nextInt();
int total = 0;
for (int i = 1; i <= N; i++) {
int sum = func(i);
if (sum >= A && sum <= B) {
total += i;
}
}
System.out.println(total);
scan.close();
}
}
今日はここまでにしました。
次回は、後半の5問を投稿したいと思います。
閲覧いただきありがとうございました