본문 바로가기
Algorithm/백준

[백준] BOJ 1316 그룹 단어 체커(자바)

by 코딩로그 2023. 1. 2.

오늘은 문자열 관련 문제를 풀어보았습니다.

문제를 풀면서 연속적으로 나오는 그룹 단어를 처리하는 방법에 대해 바로 해결 방법이 나오지 않아 이 부분에서 시간이 걸린 것 같습니다.

 

aaabbbccb

 

다음을 예시로 들어 저의 풀이 방법을 설명하겠습니다.

 

일단 저는 각 문자에 대해  카운팅을 해주어야겠다고 생각했습니다. 저는 이때 Map을 이용하였습니다. 

map에 똑같은 문자가 없는 경우에 문자를 담아주었습니다. 만약 이미 똑같은 문자가 있다면 그룹 단어가 아니라고 판단하여 boolean 체크 변수를 true로 두고 break 하였습니다.

 

 

예시와 같이 aaa처럼  연속적인 문자를 처리하기 위해 연속적으로 나오는 문자 끝까지 for문을 진행합니다. 또한, 다음 탐색은 aaa 다음인 b부터 시작하기 위해 인덱스(j)를 증가시켰습니다. 

 

 

 

구현

public class Main_1316 {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		int result = 0;
		
		String[] text = new String[N];
		
		for (int i = 0; i < N; i++) {
			text[i] = br.readLine();
		}
		
		for (int i = 0; i < N; i++) {
			Map<Character, Integer> maps = new HashMap<Character, Integer>();
			boolean flag = false;
			for (int j = 0; j < text[i].length(); j++) {
				if(maps.get(text[i].charAt(j)) == null) maps.put(text[i].charAt(j), 1);
				else {//그룹 문자가 아닌 경우
					flag = true;
					break;
				}
				//연속적인 그룹단어인지 확인한 후 연속적으로 나오는 알파벳까지 인덱스를 이동시킨다.
				for (int k = j+1; k < text[i].length(); k++) {
					if(text[i].charAt(j) != text[i].charAt(k)) break;
					else j++;
				}
				
			}
			if(!flag) result++;
		
		}
		
		
		System.out.println(result);
	}
}