Problem:
JOIとIOI

問題

与えられた文字列内の連続する3文字が，JOIまたはIOIという並びになっている個所がそれぞれ何個所あるのかを数え上げるプログラムを作成せよ．文字列はアルファベットの大文字だけからなる．例えば下図の「JOIOIOI」という文字列にはJOIが1個所，IOIが2個所に含まれている．

入力

入力は複数のデータセットからなる．各データセットは1行であり，10000文字以下のアルファベットの大文字からなる．入力は EOF で終了する.

データセットの数は 5 を超えない．

出力

データセットごとに, 1行目に見つかったJOIの個数，2行目に見つかったIOIの個数をそれぞれ出力せよ．

入出力例

入力例

JOIJOI
JOIOIOIOI
JOIOIJOINXNXJIOIOIOJ

出力例

2
0
1
3
2
3

上記問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

Solution in JAVA (judge verdict: Accepted)

import java.util.Scanner;


public class Main {
	static String[] a = new String[] {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
	static String[] b = new String[] {"D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A","B","C"};
	public static void main(String[] args) {
		Scanner stdIn = new Scanner(System.in);
		
		while (stdIn.hasNext()) {
			String tmp = stdIn.next();
			tmp = tmp.toLowerCase();
			int j = sorvj(tmp);
			int i = sorvi(tmp);
			System.out.println(j);
			System.out.println(i);
		}
	}
	
	static int sorvj(String a) {
		int ans = 0;
		for(int i = 0; i < a.length() - 2; i++) {
			IN:for(int j = 0; j < 3; j++) {
				switch(j) {
				case 0: if(a.charAt(i) != 'j') break IN; break;
				case 1: if(a.charAt(i + 1) != 'o') break IN; break;
				case 2: if(a.charAt(i + 2) == 'i') ans++; break;
				}
			}
		}
		return ans;
	}
	
	static int sorvi(String a) {
		int ans = 0;
		for(int i = 0; i < a.length() - 2; i++) {
			IN:for(int j = 0; j < 3; j++) {
				switch(j) {
				case 0: if(a.charAt(i) != 'i') break IN; break;
				case 1: if(a.charAt(i + 1) != 'o') break IN; break;
				case 2: if(a.charAt(i + 2) == 'i') ans++; break;
				}
			}
		}
		return ans;
		
	}
	
}