社内se × プログラマ × ビッグデータ

プログラミングなどITに興味があります。

AtCoder ABC162 D - RGB Triplets

atcoder.jp

使用言語は”Java (OpenJDK 11.0.6)”です。
この問題では以下の2つの条件を満たさないといけないですが、両方の条件を満たすものを探していると、パフォーマンス要件で合格が難しいようです。

f:id:blueskyarea:20200415173444p:plain
condition

1つ目の条件を満たす数は、Rの数 × Gの数 × Bの数で求めることが出来るので、そこから2つ目の条件に合わないものを除外することで、両方の条件を満たす結果が得られるようです。

import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Integer N = input.nextInt();
      	char[] S = input.next().toCharArray();
      	// for condition_1
      	long r = 0;
      	long g = 0;
      	long b = 0;
      	for (int i = 0; i < N; i++) {
        	if (S[i] == 'R') r++;
          	if (S[i] == 'G') g++;
          	if (S[i] == 'B') b++;
        }
      
      	// for condition_2
      	long result = r * g * b; // 条件1を満たす総数
      	for (int i = 0; i < N; i++) {
            for (int j = 1; j < N; j++) {
              if (i - j >= 0 && i + j < N) {
                if(S[i] != S[i-j] && S[i] != S[i+j] && S[i-j] != S[i+j]){
                  result--; // 条件2を満たさないケースを除外していく
                }
              }
            }
        }
 	System.out.println(result);
    }
}

すっかり数学の知識は忘れてしまっていますが、条件に合わないのを除外するやり方は、確率の計算をするときに似たような考え方していた気がします。