728x90
반응형

문제

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

단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 단어의 개수 N이 들어온다. N은 100보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 단어가 들어온다. 단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다.

출력

첫째 줄에 그룹 단어의 개수를 출력한다.

예제 입력 1

3 happy new year


예제 출력 1

3

예제 입력 2

4 aba abab abcabc a

예제 출력 2

1


내가 작성한 코드 (C++ 성공)

#include <iostream>

using namespace std;

int main(){	
	int n;
	int cnt = 0;
	string str;
	cin >> n;

	for(int i=0; i<n; i++){
		cin >> str;
		int size = str.length();
		bool flag = true;
		
		for(int j=0; j<size; j++){
			for(int k=0; k<j; k++){
				if(str[j] != str[j-1] && str[j] == str[k]){
					flag = false;
					break;			
				}				
			}
		}
		if(flag) cnt++;
	}
	
	cout << cnt;

    return 0;
}

 

정리

이 문제를 간단하게 정리하면 바로 앞의 문자가 같지 않은데 이전에 같은 문자가 나오면 그룹 단어가 아니란 말이다.
따라서, 그룹 단어가 아닌 조건은 다음과 같았다.

1. 현재 단어가 이전에 쓰이지 않았다.
2. '1번 조건'에 부합하고 현재 단어가 이전에 쓰인 적이 있다.

이 조건을 코드로 보면 알 수 있다.

bool flag = true;
		
for(int j=0; j<size; j++){
	for(int k=0; k<j; k++){
		if(str[j] != str[j-1] && str[j] == str[k]){
			flag = false;
			break;			
		}				
	}
}

if(flag) cnt++;

문자열을 입력받아 반복문을 통해 문자열을 각 문자를 출력할 수 있다.
그래서 문자를 하나씩 출력하면서 이전에 나왔던 문자들과 비교해주는 반복문을 하나 만들었다.
그리고 현재 문자가 바로 앞에 있는 문자와 같지 않고 이전에 나왔다면 그룹 단어가 아닌 걸로 간주하고
boolean 형을 이용해서 false로 만들어 주어 마지막에 true 인 경우만 출력해주었다.

boolean 형을 쓴 이유는 처음에 카운트를 늘려주는 방법으로 코드를 짰는데
위의 조건에 만족하는 경우가 많이 있으면 카운트가 그만큼 줄어들기 때문에 원하는 답을 찾기 어려웠다.
그래서 boolean 형을 사용해서 카운트를 따로 증가시켜주지않고 참인지 거짓인지 판별해서 출력했다.

728x90
반응형
복사했습니다!