BOJ - 1316 그룹 단어 체커

leehyunjon·2022년 6월 26일
0

Algorithm

목록 보기
78/162

Problem


Solve

문자열에서 연속된 문자가 아닌 문자가 있다면 그룹 단어가 아니다.

Set< Character > set을 통해 각 문자열의 문자를 저장한다.
그 후 Stack< Character > stack에 이전 문자를 저장해서 비교한다.

  • set에 문자가 없다.
    • set에 해당 문자를 추가한다.
    • stack에 해당 문자를 추가하여 다음 문자와 비교한다.
  • set에 문자가 존재한다.
    • stack에 있는 이전 문자와 현재 문자가 같다면 연속된 문자이기 때문에 무시
    • 이전 문자와 다른 문자라면 연속된 문자가 아니기 때문에 그룹 단어가 되지 않는다. 현재 문자열 비교 중지

Code

public class 그룹단어체커 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		int N = Integer.parseInt(br.readLine());
		String[] groups = new String[N];

		for (int i = 0; i < N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			groups[i] = st.nextToken();
		}

		int count = 0;
		for (String group : groups) {
			boolean isGroup = true;
            //stack의 peek에서 나오는 단어는 이전 단어.
			Stack<Character> stack = new Stack<>();
			Set<Character> set = new LinkedHashSet<>();

			char[] word = group.toCharArray();
			for (int i = 0; i < word.length; i++) {
				char w = word[i];
                //현재 문자가 set에 저장되어있지 않다면 set과 stack에 저장한다.
				if(!set.contains(w)){
					set.add(w);
					stack.push(w);
				}
                //현재 문자가 set에 저장되어있다.
                else{
                	//만약 이전 문자와 현재 문자가 다르다면 그룹 단어가 아니다.
					if(!stack.isEmpty() && !stack.peek().equals(w)){
						isGroup = false;
						break;
					}
				}
			}

			//해당 문자열이 그룹 문자열이라면 count
			if(isGroup) count++;
		}

		bw.write(String.valueOf(count));
		bw.flush();
		bw.close();
	}
}

Result


Reference

profile
내 꿈은 좋은 개발자

0개의 댓글