[BOJ]1316組単語Checker(JAVA)


に質問
コンビネーションワードとは、単語に存在するすべての文字に対して、各文字が連続して現れる場合にのみ使用されます.例えば、ccazzzbbは、c、a、z、bが連続して現れるため、kinもk、i、nが連続して現れるが、aabbbbcbはbが落ちたため、組合せ語ではない.
プログラムを作成し、N個の単語を入力し、グループ内の単語数を出力してください.
入力
1行目の単語の個数はNです.Nは100以下の自然数である.2行目から、単語はN行に入ります.単語はアルファベット小文字だけで、繰り返しず、最長100です.
しゅつりょく
最初の行はグループ語の個数を出力します.
例1
▼入力
3
happy
new
year
▼出力
3
例2
▼入力
4
aba
abab
abcabc
a
▼出力
1
に答える
  • 文字を順番に格納した配列(alphabat)を予め作成しておく.
  • 二重ループを実行します.外環では、導入部から単語入力が受信され、アルファベットが使用されているか否かを示す配列(bUsed)、以前に使用されていたアルファベット(preAlpha)、および格納位置(preIdx)の変数、単語が結合されているか否かを示す変数(bGroup)が宣言され、初期化される.
  • 内ループは、入力された単語をチェックする論理を記述する.
    単語の現在のアルファベット(tempAlpha)が得られ、preAlphaと比較される.異なる場合、連続するアルファベットは終了し、次のアルファベットに移動し、alphabatのインデックスを求めて、以前にも使用したかどうかを決定します.
    使用したことがある場合は,組合せ語ではないことを示し,for句を脱退する.使用されていない場合は、アルファベットが使用されていることを示し、現在のアルファベットと現在のアルファベットの位置をそれぞれ更新します.
  • 内環終了後,グループ語であるか否かを判別し,グループ語個数を増やす.
  • 💻 コード#コード#
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.IOException;
    
    public class Main {
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		String alphabat = "abcdefghijklmnopqrstuvwxyz";
    		int n = Integer.parseInt(br.readLine());
    		int cnt = 0;	// 그룹 단어 갯수
    		
    		for(int i=0; i<n; i++) {
    			String word = br.readLine();	// 단어 입력 받기
    			
    			boolean[] bUsed = new boolean[alphabat.length()];  // 연속된 알파벳 종료될 때 표시하기 위함
    			char preAlpha = word.charAt(0);	// 단어에서 사용된 알파벳(이전 알파벳)
    			int preIdx = alphabat.indexOf(preAlpha);  // 사용된 알파벳의 위치
    			boolean bGroup = true;	// 그룹단어 여부
    			
    			for(int j=0; j<word.length(); j++) {	// 단어 검사
    				char tempAlpha = word.charAt(j);  // 현재 알파벳
    				if(tempAlpha != preAlpha) {	// 연속된 알파벳이 끝났다면(다른 알파벳 등장)
    					int tempIndex = alphabat.indexOf(word.charAt(j));  // 현재 알파벳의 인덱스
    					if(bUsed[tempIndex]) {	// 이전에도 등장했다면
    						bGroup = false;	// 그룹단어 아님을 표시
    						break;
    					}
    					bUsed[preIdx] = true;	// 연속된 알파벳이 끝남을 표시
    					preAlpha = tempAlpha;	// 이전 알파벳에 현재 알파벳 갱신
    					preIdx = alphabat.indexOf(preAlpha);	// 이전 알파벳의 위치를 현재 알파벳의 위치로 갱신
    				}
    			}
    			
    			if(bGroup)	// 그룹단어인 경우
    				cnt++;	// 갯수 증가
    		}
    		
    		System.out.println(cnt);
    		
    	}
    }