問題
コード
Javaで解いてみました。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int nN = sc.nextInt();
// カード読み込み
int[] anA = new int[nN];
for (int i = 0; i < nN; i++) {
anA[i] = (int)(sc.nextLong() % 7);
}
// カード検索
int nCount = 0;
for (int i = 0; i < (nN - 2); i++) {
int a = anA[i];
for (int j = (i + 1); j < (nN - 1); j++) {
int b = anA[j];
for (int k = (j + 1); k < nN; k++) {
int c = anA[k];
if (((a + b + c) % 7) == 0) {
nCount++;
}
}
}
}
// 結果出力
System.out.println(nCount);
}
}
解説
標準入力からの数値の読み取り
Scanner インスタンスを作り、nextInt()メソッドで数値を取得しています。
カード読み込み
配列 anA[] にカードの番号を入れますが、
- そのまま足して、7で割った余りを求める
- あらかじめ7で割った余りを足して、7で割った余りを求める
の結果は同じになるので、あらかじめ7で割った余りを格納しています。
カード検索
まず、0 〜 (N-1)-2(2枚選べるように残す為2を引く)番目のカードから、i番目のカードを1枚目として選びます。
次に、i+1 〜 (N-1)-1(1枚選べるように残す為1を引く)番目のカードから、j番目のカードを2枚目として選びます。
最後に、j+1 〜 N-1 番目のカードから、k番目のカードを3枚目として選びます。
すると、重複しない3枚組のカードを全て選ぶことができます。
あとは、3枚のカード anA[i], anA[j], anA[k]の数を足し、7で割った余りが0ならば、nCount を1増やしていきます。