smooth waters run deep

1d-1c/BOJ

1316_그룹 단어 체커 (C++)

yeon_11 2020. 8. 28. 11:23
 

1316번: 그룹 단어 체커

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

www.acmicpc.net

#include <iostream>
using namespace std;

int check(string word) {
	int alpha[26] = { 0, };
	int j = 0;

	while (j != word.length()) {
		if (j == 0) { //첫 번째 문자: 방문체크, j++
			alpha[(int)word[j] - 97] = 1;
			j++;
		}
		else {
			if (word[j] == word[j - 1]) j++; //이전 문자와 같다면 j++
			else{
            //이전 문자와 다르다면: 
            // 방문체크되어있으면 break/ 안되어있으면 방문체크,j++
				if (alpha[(int)word[j] - 97])
					break;
				else {
					alpha[(int)word[j] - 97] = 1;
					j++;
				}
			}
		}
	}
		
	return j;
}

int main() {
	int N;
	cin >> N;

	int ans = 0;
	for (int i = 0; i < N; i++) {
		string word;
		cin >> word;
		
		if (check(word) == word.length())
			ans++;
	}
		
	cout << ans;
	return 0;
}

 

처음에 i번째 문자와 i+1번째 문자를 비교해서 접근했다. 하지만 너어어어무 많이 튀어나오는 예외들!

질문게시판에 있는 모든 반례를 체크했는데도 틀렸습니다!가 떠서 질문게시판에 글도 남겼다.

하지만 또 튀어나오는 반례들로.. 문제 접근을 잘못했구나 완전 깨닫고 다시 풀었당 ㅎㅎ 

 

[문제 풀이 생각 과정]

1. 이전에 나온 문자인지 확인하기 위해서 - 배열 alpha[26]을 만들었다.

2. 하나의 단어에 대해서 마지막 문자까지 확인하는 경우 = 그룹 단어라고 생각했다.

   각 문자를 체크하고 그룹단어 조건에 맞는 경우 j++, 마지막 문자까지 확인했을 때 j==단어.length() 라면 그룹단어! 라고 판단

3. 첫 번째 문자는 말그대로 '첫 번째 문자'이기 때문에 생각하지 않는다.

4. 1) [i]=[i-1] 일때 : 연속해서 같은 문자가 나오는 경우이기 때문에 j++

    2) [i]!=[j-1] 일때 : i번째 문자가 방문체크 되어 있는지 확인해야 된다.

       - 방문체크O  : 이전에 이미 나온 문자가 또 나온 경우! 그룹단어가 아니다. break

       - 방문체크X : 새로 등장하는 문자다. 방문체크하고 j++

 

** 예외가 계속 튀어나온다면 - 문제 접근이 잘못된것!!! 다시 생각하자

 

'1d-1c > BOJ' 카테고리의 다른 글

11047_동전0 (JAVA)  (0) 2020.09.09
11399_ATM (JAVA)  (0) 2020.09.09
2941_크로아티아 알파벳 (C++)  (0) 2020.08.26
5622_다이얼 (C++)  (0) 2020.08.26
2908_상수 (C++)  (0) 2020.08.26