본문 바로가기
알고리즘/백준

백준 1316번 - 그룹 단어 체커 (Java 8)

by latissimus 2021. 9. 14.

 

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

 

1316번: 그룹 단어 체커

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

www.acmicpc.net

 

 

 

분류 : 단계별 문제 - 문자열

소요 시간 : 1시간 30분

 

실행 코드 :

import java.io.*;
import java.util.*;


public class Main {
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		Set<Character> checker;
		List<Character> groupedArr;
		
        int countAnswer = 0; //그룹 함수 개수 카운트
		int arrayNum = Integer.parseInt(br.readLine());
		
		for(int i=0; i<arrayNum; i++) {
			char[] arr = null;
			arr = br.readLine().toCharArray();
			checker = new HashSet<Character>();
			groupedArr = new ArrayList<Character>();
				
			for(int j=0; j<arr.length-1; j++) {
				if(j ==0){ 						
					groupedArr.add(arr[0]);
					checker.add(arr[0]);
				}
				if(arr[j] != arr[j+1]) {
					groupedArr.add(arr[j+1]);		
					checker.add(arr[j+1]);
				}
			}
				if(groupedArr.size() == checker.size()){
					countAnswer++;
				}
		}
		System.out.println(countAnswer); 
	}
}

 

풀이 과정 :

우선, 입력받은 단어를 toCharArray()를 활용하여 배열에 저장했다.

 

그 다음, 인덱스 값으로 배열 내부에 인접한 두 값을 차례로 비교해서 비교한 두 값이 다를때마다 뒤에 있는 값을 두 개의 자료구조(HashSet, List)에 저장했다. 맨 앞에 값(arr[0])은 무조건 저장되야하므로, 지정해서 대입했다.

    ex) "happy"를 입력 => 'h', 'a', 'p', 'y' 가 자료구조에 저장 (숫자가 연속된 경우 하나씩만 저장)

 

HashSet은 중복 값을 허용하지 않기때문에 HashSet과 List의 size를 비교해서 값이 같다면 그룹단어이다.

    ex) "aabbaa"라는 단어를 입력 => List : 'a', 'b', 'a' 저장, HashSet : 'a', 'b'  저장 => size 각각 3, 2

        "aabbcc"(그룹단어)를 입력 => HashSet, List : 모두 'a', 'b', 'c'  저장 => size가 각각 3, 3

 

값이 같을때마다 countAnswer의 값을 1씩 증가시켜서 그룹단어의 개수를 카운트했다.

 

 

 

 

초보입니다. 자잘한 지적해주시면 언제나 감사합니다.

댓글