文系プログラマーのプログラミング備忘録

Java、競プロ、数学などについて書いてます

入れ替え [AtCoder Beginner Contest 004 C]

atcoder.jp


6枚のカードに対して、N 回の交換操作をおこなう。
N 回目の操作では、左から N%5 番目のカードと、右から N%5+1 番目のカードを交換する。
操作を N 回おこなったあとのカードの並びを出力せよ。


N は最大で 10^9 なので、愚直にシミュレーションすると TLE します。


解説にあるように、カードの並びは30回操作するごとに元の状態に戻ります。
よって、N 回の操作は N%30 回 の操作とすればよく、操作回数は最大でも30回となり間に合います。

void solve () {

	List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4,5,6));

	int n = nextInt();
	for (int i=0; i<n%30; i++) {
		Collections.swap(list, i%5, i%5+1);
	}

	for (int i=0; i<list.size(); i++) out.print(list.get(i));
	out.println();

}


配列ではなくリストを使っているのは、swap メソッドが使えるからです。配列だと片方の値を一時的に格納しておく変数が必要になるので、少しだけ楽ができます。


今回、リストの初期化には

List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4,5,6));


としています。一行で書けるので楽ですね。
一行でリストを初期化するやり方には、

List<Integer> list = Arrays.asList(1,2,3,4,5,6);


という書き方もあり、こちらのほうが記述量が少なくて済みますが、追加も削除もできない固定リストになってしまうので注意が必要です。