본문 바로가기
Algorithm/Baekjoon

[백준 알고리즘][자바] 1316번 : 그룹 단어 체커

by hyunipad 2021. 6. 13.
반응형

https://www.acmicpc.net/problem/1316

 

1316번: 그룹 단어 체커

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

www.acmicpc.net

이번 포스팅은 백준 알고리즘의 1316번: 그룹 단어 체크입니다.

그룹 단어란 입력받은 단어의 모든 문자에 대해서, 각 문자들이 모두 연속해서 나타나는 경우를 말합니다.

이번 문제에서 포인트는 아래의 두 가지입니다.

  1. 그룹 단어는 하나의 연속된 문자가 끝이 나면 다음 문자부턴 존재하지 않는다.
  2. 1개의 문자도 연속된 문자이다.

입력받은 단어 중에 그룹 단어의 갯수를 출력하면 됩니다.

 

문자열을 이용한 알고리즘 문제에서 자주 등장하는 패턴 중 하나는 아스키코드를 이용하는 것입니다.

아스키코드는 아래와 같은 표로 이루어져 있습니다.

대문자 A는 십진수로 65, 소문자 a는 십진수로 97입니다.

자바에서는 문자열을 사칙연산을 하면 알파벳들을 아스키코드표에 따라 십진수로 변환 후 계산해주기 때문에

알파벳의 개수 26개만큼 배열을 선언 후 아래와 같이 계산식을 넣으면 알파벳들을 체크해줄 수 있습니다.

alphabet[nowWord - 'a']

nowWord 가 b라면 소문자 b는 98이기 때문에 alphabet [1]이 되어 개발자가 원하는 방향으로 체크해줄 수 있습니다.

 

이러한 아스키코드를 이용한 패턴으로 그룹 단어 체크를 해주면 아래의 정답이 나오게 됩니다.

아스키코드를 이용한 문자열 알고리즘 문제는 비교적 자주 나오는 거 같습니다.

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

public class Main {

	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		
		
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int result = 0;
		int count = Integer.parseInt(br.readLine());
		
		for(int i = 0 ; i < count ; i++) {
			if(check() == true) {
				result++;
			}
		}

		bw.write(String.format("%d", result));

		br.close();
		bw.flush();
		bw.close();
	}
	
	public static boolean check() throws IOException {
		boolean[] alphabet = new boolean[26];
		
		int prevWord = 0; // 이전 문자
		int nowWord = 0; // 현재 문자
		String str = br.readLine();
		
		for(int y = 0 ; y < str.length() ; y++) {
			nowWord = str.charAt(y);			
			if(prevWord != nowWord) { // 이전문자와 같지 않다면 => 중복이 끝난 것
				if(alphabet[nowWord - 'a'] == false) { // 해당문자가 처음 나온 경우
					alphabet[nowWord - 'a'] = true;
					prevWord = nowWord;
				}else { // 해당문자가 이미 나온 경우 => 그룹단어가 아닌 것!!
					return false; // 리턴
				}
			}else { // 같다면 => 중복문자
				continue;
			}
		}
		return true; // return false 되지 않았으면 그룹 단어 !!
	}
}

 

반응형

댓글