백준/단계별

[C++] 백준 1316

loasd 2022. 12. 17. 01:02
반응형

백준의 1316번 문제 그룹 단어 체커이다.

 

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

 

1316번: 그룹 단어 체커

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

www.acmicpc.net


 < 문제 >

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

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

 

 < 예제 >

 

문제를 먼저 설명하자면 이렇다.

예를들어 aabbcc라고 있다고 하자. 이 문자열은 각각의 문자들이 연속되어있고 같은 문자가 떨어져있지 않기 때문에 그룹단어라고 한다.

aabbcca를 보면 어떨까

이 문자는 b와 c는 전부 이어져있지만 a는 앞의 aa와 맨뒤 a가 떨어져있기 때문에 이 문자열은 그룹단어가 아닌 것이다.

 

조건을 요약하면 각각의 단어들을 사용하는데 연속되어있지 않을 경우에는 그룹단어가 아닌 것이다.

또한 2글자 이내는 전부 그룹단어로 본다.

예제 5의 경우 z 하나만 있는 경우와 예제3의 ab, aa, ba, bb는 그룹단어로 본다.

 

 * 문자를 사용하는데 한번만 사용하며 이 때 이어서만 사용할 수 있는 것

  aba / aca  이런식으로 같은 단어 사이에 다른 단어가 있으면 안됨

 

#include <iostream>
#include <string>
using namespace std;

int main() {

	int t;
	cin >> t;

	string str;
	int count = 0;

	for (int i = 0; i < t; i++) {
		cin >> str;

		if (str.length() <= 2) {
			continue;
		}
		else {
			for (int j = 0; j < str.length() - 1; j++) {
				if (str[j] != str[j + 1]) {
					if (str.find(str[j], j + 2) != string::npos) {
						count++;
						break;
					}
				}
			}
		}
	}
	cout << t - count;
}

이 코드를 작성하는데 다른 사람들의 코드들도 참조하며 작성하였다.

먼저 테스트케이스 t를 입력받고 t만큼 string str을 입력받는다.

이 때 str의 길이가 2보다 작을 경우에는 그대로 진행하도록 한다.

그 외의 경우에는 이렇게 실행된다.

for (int j = 0; j < str.length() - 1; j++) {
				if (str[j] != str[j + 1]) {
					if (str.find(str[j], j + 2) != string::npos) {
						count++;
						break;
					}
				}

간단히 말하자면 이렇다.

1) 현재 위치의 문자와 다음 문자의 위치가 다를 경우

2) 현재 위치보다 2번 뒤의 위치에서 같은 단어가 있는 경우

str[0] str[1] str[2] str[3] str[4]
a b b a a

이렇게 위치해 있다고 하면 현재 위치가 str[0]이라고 가정하자 바로 옆의 str[1]은 같던 다르던 상관 없기 때문에

str[2]부터 탐색을 하면 된다. 그래서 시작 위치를 j+2로 하였다.

 

find를 통해 찾는 문자가 없는 경우에는 string::npos를 반환하기 때문에 그 뒤에 같은 문자가 있을 경우에는 count++를 해준다.

이 코드에서는 입력된 문자열의 갯수 - 그룹단어의 갯수 를 통해 계산하기 때문에 count++를 한 것

그리고 이미 있다면 어차피 그룹단어가 아니기 때문에 break; 해주고 마지막에 입력된 문자열의 갯수 - 그룹단어의 갯수를 계산해서 출력해주면 된다.

 

 

 

이 문제를 푸는데 많은 시간이 걸렸다. 다른 사람들의 풀이를 보고 푸는것도 중요하지만 풀이 과정을 이해하는 것이 더 중요하다고 생각한다.

 

 

 

반응형