はじめに
ABC003同様一筋縄では行かず、またD問題が解けませんでした。難しい・・・。
とりあえず、解けた問題のコードを説明していきます。
A - 流行
問題文はこちら
普通に二倍しましょう。
A.java
import java.util.*;
class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//値の取得
int N = sc.nextInt();
//二倍した物を出力
System.out.println(N*2);
}
}
いわゆる「やるだけ」。
B - 回転
問題文はこちら
4×4ということで二次元配列使っても良かったんですがなんとなく一次元配列にしました。
普通に取得して逆から出力しましょう。
B.java
import java.util.*;
class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//文字の取得
String[] str = new String[16];
for(int i=0;i<str.length;i++){
str[i] = sc.next();
}
//逆から出力
for(int i=str.length-1;i>=0;i--){
System.out.print(str[i]+" ");
//iが4の倍数のときに改行するとちょうど良い
if(i%4==0) System.out.println("");
}
}
}
今思えば一行ずつまるごと取得しても面白そうでしたね(逆順がちょっと面倒ですが)。
C - 入れ替え
問題文はこちら
なんか部分点が~みたいなのが書いてあったので普通に解くとTLE出るんだろうなあ・・・。って思ったので以下の等式関係を見つけ出して実装しました(N=nの時の解答の文字列をS(n)、kを自然数とする)。
S(n)=S(n+30k)
C.java
import java.util.*;
class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//値の取得(Nは30で割った余りに予め整形)
int N = sc.nextInt()%30;
//カードの準備
int[] card = {1,2,3,4,5,6};
//N(mod30)分は普通に行なう
for(int i=0;i<N;i++){
int temp = card[i%5];
card[i%5] = card[(i%5)+1];
card[(i%5)+1] = temp;
}
//一枚ずつカードの数字を出力(改行なし)
for(int i=0;i<card.length;i++){
System.out.print(card[i]);
}
//最後に改行
System.out.println("");
}
}
運良く法則に気付いて良かった・・・。
D - マーブル
問題文はこちら
ACが取れ次第更新予定
総評
A:優しい。
B:いろいろやり方がありそう。
C:ちょっと考察が必要。
D:
もう全部解答して解説、という訳にはいかなそうな難易度ですね。
ABC005以降もこんな感じになりそうですが許してください。