문제풀이

[JAVA] 백준 1316번 그룹단어 체커 : 중복값

IT록흐 2021. 7. 13. 11:05
반응형
 

1316번: 그룹 단어 체커

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때

www.acmicpc.net

 

1. 문제 추상화 

 

1차 추상화

그룹단어란 연속된 문자로 이루어진 단어를 의미한다. 만약 연속되었던 문자가 한번 더 연속되면 그룹단어가 아니다.

 

2차 추상화

입력받은 영단어에서 문자가 중복되어 연속되지 않은 그룹단어의 개수를 구하시오.

 

2. 알고리즘

 

이 문제는 간단히 말해서 중복체크 문제이다.

 

첫 번째 방법

HashSet 이용하기

 

1. 입력받은 문자열을 한 문자씩 체크한다. (for문)

2. 문자가 변하는 횟수를 센다. (countChar)

3. 문자가 변할 때 마다 HashSet 객체에 문자를 add한다.

4. HashSet은 중복된 값은 add하지 않으므로, 만약 문자가 변하는 횟수와 HashSet의 size()가 다르면 그룹단어가 아니다.

 

두 번째 방법

boolean 배열 만들기

 

1. 알파벳 개수 크기의 boolean 배열 생성

2. 연속된 알파벳 문자와 대응되는 인덱스 위치에 true 저장

3. 이미 값이 true라면 중복이므로 그룹단어가 아니다.

 

3. 풀이

 

첫 번째 방법 (HashSet 이용하기)

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashSet;

public class Main {

	public static void main(String[] args) throws NumberFormatException, IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int testcase = Integer.parseInt(br.readLine());
		int nGroupWord = 0;
		
		for(int i=0; i<testcase;i++) {
			
			String str = br.readLine();
			char previousChar =0; // 이전 문자
			int countChar = 0; // 문자가 변하는 횟수 카운트
			HashSet<Character> usedChar = new HashSet<Character>(); // HashSet
			
			for(int j=0; j<str.length();j++) {
				// 만약 이전 문자와 다르다면
				if(previousChar != str.charAt(j)) {
					previousChar = str.charAt(j); 
					countChar++; //변하는 횟수 카운트 
					usedChar.add(str.charAt(j)); // HashSet에 저장
				}
			}
			
			if(countChar == usedChar.size()) nGroupWord++; // 변하는 횟수와 HashSet의 size()가 일치하면 그룹단어이다.
		}
		
		bw.write(nGroupWord+"");
		bw.flush();
		bw.close();
		br.close();
	}

}

 

 

두 번째 방법 ( boolean 배열 이용하기 )

 

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

public class Main {

	public static void main(String[] args) throws NumberFormatException, IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int testcase = Integer.parseInt(br.readLine());
		int nGroup = 0;
		
		for(int i=0;i<testcase;i++) {
			String str = br.readLine();
			
			boolean[] alphabet = new boolean['z'-'a'+1]; // 알파벳 개수 크기의 boolean 배열
			char previousChar = 0; // 이전 문자
			
			for(int j=0; j<str.length();j++) {
				// 이전 문자와 현재 문자가 다르다면
				if(previousChar != str.charAt(j)) {
                	//checkAlphabet 메소드 호출
					if(checkAlphabet(str.charAt(j)-'a',alphabet)) { 
                    // true이면 연속이 중복되므로 그룹단어가 아니다.
						break;
					}else { //false이면 대응되는 인덱스의 값을 true로 바꾼다.
						alphabet[str.charAt(j)-'a'] = true;
					}
					previousChar = str.charAt(j);
				}
				// 반복이 다 돌면 그룹단어이다.
				if(j==str.length()-1) nGroup++;
			}
		}
		
		bw.write(nGroup+"");
		bw.flush();
		bw.close();
		br.close();
	}
	
    // 대응되는 인덱스의 값이 true인지 false인지 반환
	public static boolean checkAlphabet(int value, boolean[] alphabet) {
		
		if(alphabet[value] == true) return true;
		else return false;
		
	}
}

 

 

반응형