본문 바로가기
백준 풀이

[백준 풀이_Java] 1316 그룹단어 체커

by happyhelen 2021. 10. 27.

 

 

 

처음 생각

 

비교 기준이 되는 알파벳을 @, @ 바로 이전의 알파벳을 #, @ 이전의 알파벳들 중 # 을 제외한 알파벳들을 % 라고 하자

 

그러면 비교하려는 시점의 알파벳은 %...%#@ 라고 표현할 수 있다

 

처음에는 charAt 을 이용해서 이중 for 문으로 비교하려고 했다

 

@이 바로 #과 같으면 %들과 비교해서 바로 # 이외에 또 중복되는 게 있는지 확인하고

 

@이 #과 다르면 %들과 비교해서 중복되는 게 있는지 확인한다

 

지금 생각해보면 비교하는 기준이 이상하긴 한데 여튼 이렇게 생각하니까 풀리지 않았다

 

그리고 한 가지 간과한 사실은 @이 #과 같다는 것은 이미 %들이 중복되는 것이 없다는 말이다

 

즉, @과 #을 비교하려 하는 시점에는 %들은 중복되지 않았다는 검증을 거친 것이다

 

그러므로, @이 #과 같다면 %들이 중복되는지 검사 하지 않아도 되고

 

@이 #과 같다면 %들이 중복되는지 검사해야 한다

 

위의 모형 개념은 아래의 풀이에도 적용된다

 

 

 

 

내가 푼 방법

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int testCase = Integer.parseInt(br.readLine());
		int cnt =0;
		
		for(int i=0; i<testCase; i++) {
			String word = br.readLine();
			if(checkApb(word)) cnt++; // true 면 cnt++
		}
		System.out.println(cnt);
	}
	
	static boolean checkApb(String word) {
		int[] apbCase = new int[26]; // 알파벳 케이스
		boolean result = true;
		
		for(int i=0; i<word.length()-1; i++) {
			char now = word.charAt(i);
			char next = word.charAt(i+1);
			apbCase[now-'a'] = 1; // @ 인덱스를 1로 바꾸기
			
			if(next==now) continue; // @ == # 이면 continue
			else { // 아니면 중복비교
				if(apbCase[next-'a'] == 1) {// 이미 존재하면
					result = false;
					break;
				} else continue; // for문 처음으로
			}
		}
		return result;
	}
	
}