[백준 BOJ] 1316번 그룹 단어 체커 (C++/cpp)

2022. 5. 9. 01:42PS (Program Solving)/BOJ (백준)

문제 설명

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

 

1316번: 그룹 단어 체커

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

www.acmicpc.net

백준 BOJ 1316번 그룹 단어 체커 문제 사진1
백준 BOJ 1316번 그룹 단어 체커 문제 사진2

 

접근 방법 - 아스키코드를 이용한 연산 문제

백준의 1316번 문제는 아스키코드를 이용한 연산이 필요한 문제이다.

해당 문제는, 동일한 알파벳이 흩어져있지 않고 이른바 알파벳들이 연속해서 나타나는 "그룹 단어"를 판별해야 하는 문제이다.

필자의 경우에는 배열을 통해 알파벳의 빈도를 카운팅하면서 특정 조건을 만족하지 않을 경우 그룹 단어가 아님을 판별하는 식으로 문제를 해결해보았다.

이에 대한 자세한 설명은 아래를 참고해보길 바란다.

아마 아스키코드에 대해 이해하고 있으며 문자열과 배열을 다루는 데에 능숙하다면 그리 어렵지 않게 풀 수 있을 것이다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) 단어의 수(n)를 입력받는다.

 

2) 그룹 단어의 개수를 카운팅할 변수 num을 0으로 초기화하여 선언한다.

 

3) n의 크기만큼 반복문을 실행하여 아래의 연산을 취한다.

- 문자열(str)을 하나씩 입력받는다.

- 알파벳의 빈도수를 측정할 배열(arr)을, 배열값을 모두 0으로 초기화하여 선언한다.

- str의 문자들을 탐색하며 실시간으로 알파벳의 빈도수를 측정한다. 동시에 아래의 조건문들도 함께 실행한다.

만일, 앞에 이미 출현했던 알파벳이며 바로 이전의 알파벳과 동일하지 않은 경우, 이는 그룹 단어로 취급하지 않기 때문에 즉시 반복문을 종료한다.

다만, break문을 거치지 않고 문자열의 끝까지 왔다면, 이는 그룹 단어로 취급한다. 따라서 이 경우엔, num에 1을 더한다.

 

4) 연산이 모두 끝났다면, 최종적으로 저장된 num의 값을 출력한 뒤 실행 종료한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#include <string>
#define endl '\n'
using namespace std;

//백준 1316번 코드
int main() {
	int n;
	cin >> n;

	int num = 0;
	for (int i = 0; i < n; i++) {
		string str;
		cin >> str;
		int arr[26] = { 0 };
		for (int j = 0; j < str.length(); j++) {
			if (j > 0 && str[j] != str[j - 1] && arr[str[j] - 'a'] != 0) { break; }
			if (j == str.length() - 1) { num++; }
			arr[str[j] - 'a']++;
		}
	}
	cout << num << endl;
}

 

제출 결과

백준 BOJ 1316번 그룹 단어 체커 문제 C++ 제출 결과

(2022.04.03 백준 1316번 문제 제출 결과)

반응형