1316 그룹 단어 체커

DONGJIN IM·2022년 6월 28일
0

코딩 테스트

목록 보기
105/137

문제 이해

문자열이 하나 주어진다.
이 때, 문자열에서 모든 문자가 연속해서 나타나는 문자열을 "그룹 단어"라고 한다.
(예 : aabbccb에서 a와 c는 연속해서 존재하지만, b는 사이에 cc라는 단어 때문에 연속하지 않으므로 그룹 단어가 아니다)

단어 N개를 입력 받았을 때, 그룹 단어 개수를 모두 구하는 문제이다.


문제 풀이

문자는 a~z까지 총 26가지 존재한다.

따라서, a~z와 대응할 수 있는 int형 배열을 만든 이후 3가지 Case로 쪼갰다.

  1. arr[x]=0
    x라는 문자가 해당 문자열에서 처음 나왔음

  2. arr[x]=1
    x라는 문자가 이전에 연속된 문자열로 나온 경우가 존재함

  3. arr[x] = 2
    x라는 문자가 현재 연속되고 있는 문자임

예를 들어, aabbccd라는 문자가 있을 때, d를 검사할 순서라고 가정하자.
먼저 d는 이전에 검사하지 않았던 문자이므로 arr[d] = 0의 값을 가지고 있을 것이다.
그리고, 이제 처음으로 검사한 값이므로 arr[d] = 2로 변경되어야 할 것이다.

또한 c라는 단어는 이전에 연속되고 있다는 문자로써 arr[c] = 2의 값을 가지고 있었을 것이다.
그런데 이제는 d를 검사할 것이므로 arr[c] = 1로 값을 변경해야 할 것이다.

마지막으로 a, b는 이미 연속되었으며 확인했던 문자이므로 arr[a] = arr[b] = 1일 것이다.

그렇다면 그룹 단어를 어떻게 확인할 수 있을까?

답은 간단하다. 현재 검사하고 있는 단어가 X일 때, arr[X] = 1이라면 이전에 확인했던 단어인데 다시 나왔다는 의미이고, 이는 같은 단어 사이에 다른 단어(혹은 문자열)이 포함되어 있다는 의미이므로 그룹 단어가 아니라는 의미이다.


코드

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

public class Main {
	static StringBuilder sb = new StringBuilder();
	
	public static void main(String[] args) {
		FastReader sc = new FastReader();
		
		int N = sc.nextInt();
		int answer = N;
        // 모든 단어가 그룹 단어라면 답은 N
		
		for(int i =0;i<N;i++) {
			int[] arr = new int[26];
			
			String s = sc.next();
			
			int before_idx = -1;
			
			for(int j =0;j<s.length();j++) {
				int idx = s.charAt(j) - 'a';
				
				if(arr[idx]==0) {
                // idx 단어가 처음 체크되는 단어임
					arr[idx] = 2;
                    
					if(before_idx!=-1) {
                    // idx 이전에 연속되었던 단어에 대응되는 배열값을 1로 만듦
						arr[before_idx] = 1;
					}
                    
					before_idx = idx;
                    // 현재 연속임을 확인해야할 값은 idx로 바뀌었음
				}
				else if(arr[idx] == 1) {
                // idx 단어가 이전에 체크가 완료되었던 단어임
                // 그룹 단어가 아니므로 1을 빼준다.
					answer--;
					break;
				}
			}
		}
		
		System.out.println(answer);
	}
	
	
	static class FastReader // 빠른 입력을 위한 클래스
}

결과

profile
개념부터 확실히!

0개의 댓글

관련 채용 정보