본문 바로가기
개발/알고리즘 풀이...

[백준] 1316 풀이

by p_human 2020. 6. 5.

오랜만에 알고리즘 문제를 풀어봤다. 문제를 처음 봤을 때는 아무것도 몰랐지만, 계속 끙끙대면 보다보니 풀게 되었다. 

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

 

1316번: 그룹 단어 체커

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

www.acmicpc.net

 

문자열을 몇개 입력받을 것인지, 입력 받은 문자열의 그룹단어를 어떻게 찾는지, 중복을 어떻게 검사할 것인지, 어떻게 결과를 출력할 것인지...

천천히 생각하면서 차근차근 하다보면(당연한 말) 문제를 해결할 수 있는 열쇠를 얻을 수 있다.

 

아래는 코드다.

물론 이것보다 효율적인 코드는 많겠지만 답을 보지 않고 온전히 내 머리로만 풀었기 때문에 더욱 의미있는 코드라고 생각된다.

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
	int count; // 문자열의 개수를 담을 변수
	cin >> count;

	char str[101]; // 각 문자열의 최대 길이를 담을 변수
	int result = 0; // 결과 출력에 사용할 변수
    
	// 단어의 중복 처리를 위해 사용할 변수이다.
	// 이 배열이 가장 중요한 포인트이다. alpha를 이용해서 입력받은 문자열의 알파벳의 개수를
	// 전부 다 세고, 세 번째 while문에서 사용하는 걸 볼 수 있다. 자세한 내용은 밑에서...
	int alpha[26] = { 0 };
	for (int i = 0; i < count; i++)
	{
		cin >> str;
		int c = 0;
		alpha[26] = { 0 }; // 초기화를 해주는 이유는 다음 루프에서도 사용하기 위해서
		while (str[c] != '\0') { // 각 알파벳의 개수를 셈
			alpha[str[c] - 97]++;
			c++;
		}
		int j = 0; // 배열의 접근하기 위한 요소
		while (j < strlen(str)) { // 모든 배열에 접근을 위한 반복문
			int wordCheck = 0; // 단어 중복 처리를 위한 변수
			int k = 0;
			// 각 알파벳의 개수만큼 반복문을 돌린다. 이렇게 하는 이유는 각 단어마다
			// 중복처리를 위함이다. 단어가 만약에 "ddddeeeedffff" 이런식으로 입력이
			// 들어오면 알파벳 'd'의 개수는 5개이지만 연속되는 'd'의 개수는 4개다. 
			// 이를 이용해서 만약 알파벳의 개수만큼 반복을 했는데 wordCheck, k의 값이
			// 똑같지 않다면 중간에 단어의 연속성이 끊어진 것이다.
			while (k < alpha[str[j] - 97]) { 
				if (str[j] == str[j + k]) 
					wordCheck++;
				k++;
			}
			// 이렇게 체크를 해준다.
			// 한 단어의 연속성이 확인되었다면, 다음으로 넘어가는 식이다.
			if (wordCheck == k) j += k;
			else break;
		}
		if (j == strlen(str)) result++;
	}
	cout << result;
}

'개발 > 알고리즘 풀이...' 카테고리의 다른 글

[백준] 4796번 문제 풀이  (0) 2021.03.12
[백준] 1946번 문제  (0) 2021.03.10
[백준] 2217번 문제  (0) 2021.03.09
[백준] 11052번 문제 풀이  (0) 2021.03.05
[백준] 2908 풀이  (0) 2019.12.29