Notice
Recent Posts
Recent Comments
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
관리 메뉴

일상

[c++] 백준 1316: 그룹 단어 체커 본문

programming

[c++] 백준 1316: 그룹 단어 체커

Mysteryu 2023. 6. 6. 21:20

문제를 푸는데 시간을 꽤 소모하였고 때문에 이때의 생각을 남겨두는 것이 좋을 것 같아서 남긴다.

 

우선 제출 코드는 아래와 같다.

 

#include <iostream>

int main() {

	int N;
	std::cin >> N;

	std::string* s = new std::string[N];

	for (int a = 0; a < N; a++) {
		std::cin >> s[a];
	}
	int count = 0;

	bool flag = false;

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < s[i].length(); j++) {

			int last_idx = j;
			for (int k = j; k < s[i].length(); k++) {
				if (s[i][j] == s[i][k]) {
					if (k - last_idx >= 2) {
						flag = true;
						break;
					}
					else {
						last_idx = k;
					}
				}
			}
			if (flag) {
				count++;
				flag = false;
				break;
			}

		}
	}

	std::cout << N - count << "\n";

	delete[] s;

}

 

문제풀이 :

문제풀이는 그냥 brute force 방법을 사용하였다.

그냥 문자열이 있을 때 처음 문자부터 마지막 문자까지, 그리고 두번째 문자부터 마지막 문자까지, ..., 마지막 문자부터 마지막 문자까지 다 비교를 하게 된다. 

0 1 2 3 4 5 6

   1 2 3 4 5 6

      2 3 4 5 6

         3 4 5 6

            4 5 6

               5 6

                  6

 

즉 맨 처음의 문자가 기준문자가 되고 차례대로 마지막 문자까지 비교를 하게 된다.

이때 last_idx 변수는 가장 최근에 기준 문자와 비교 문자가 같을 때 비교 문자의 index를 가져온다. 따라서 만약 index가 2이상 차이가 난다면 몇 개의 문자를 건너 뛰고 다시 같은 문자가 나오는 것이므로 그룹단어가 아니다.

 

이때 flag 변수를 true로 놓고 세번째 반복문에서 빠져나온다. 그리고 두번 째 반복문의 flag 변수 검사에서 flag가 ture일 때 count를 증가시키고 두번 째 반복문을 빠져나온다. 즉, count는 그룹단어가 아닌 문자열을 체크한다. 마지막으로 입력 문자열 개수와 그룹단어가 아닌 문자열의 개수를 빼서 그룹단어가 있는 문자열의 개수를 반환한다.

'programming' 카테고리의 다른 글

[C++] 백준 10798: 세로 읽기  (0) 2023.06.20
[c++] 백준 2914: 크로아티아 알파벳  (0) 2023.06.07
[c++] 백준 2444  (0) 2023.05.31
[c++] 백준 1157  (0) 2023.05.30
[c++] 백준 10988  (0) 2023.05.25
Comments