| 문제
그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, 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
| 문제의 키 포인트
1. 첫째 줄에 단어의 개수 N을 입력받는다. (0 ≤ N ≤ 100)
2. 둘째 줄부터 N개의 줄에 단어를 입력받는다.
3. 단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다.
4. 그룹 단어의 조건
- 같은 알파벳이라면 연속해서 나타나야 한다.
5. 출력으로 그룹 단어의 개수를 출력한다.
| 해결방안(Solution)
1. 단어의 개수 N을 입력받은 뒤 N만큼 반복문을 실행한다.
2. 반복문에서는 (1) 단어 입력 (2) 그룹 단어여부 카운트
3. 반복문이 끝나고, 최종 그룹 단어의 개수를 출력한다.
| 소스코드(SourceCode)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int check(char a[], int len); // 그룹 단어 검사 함수
int main(void)
{
int i, N;
char arr[100]; // 문자열
int cnt = 0; // 그룹 단어 개수
// 단어의 개수 입력부
scanf("%d", &N);
for (i = 0; i < N; i++)
{
// 단어 입력부
scanf("%s", arr);
cnt += check(arr, strlen(arr));
}
printf("%d", cnt);
return 0;
}
int check(char a[], int len)
{
int i, j;
int key = 0;
for (i = 0; i < len; i++)
{
for (j = 0; j < len; j++)
{
if (a[i] == a[j])
{
key = j - i;
if (key > 1)
{
// 그룹 단어인지 검사
if (a[j - 1] != a[j])
{
return 0;
}
}
}
}
}
return 1;
}
이번 문제에서는 그룹 단어를 검사하는 부분에서 중첩 반복문을 사용하다보니 따로 함수를 만들어 값을 도출해내었습니다.
1. 배열[0] 부터 배열[0, 1, 2, ...] 비교하는 형태이며,
2. 이 때 배열의 위치가 다를 경우 key라는 조건값을 통해 해당 배열값과 이전 배열값이 동일한지 여부를 검사합니다.
3. 값이 다를 경우 반환값으로 0을 반환(그룹 단어가 아니라면) 하며 함수가 종료되고,
4. 값이 같다면 반복문을 문자열의 크기만큼 계속 실행한 뒤 마지막으로 반환값으로 1을 반환합니다.
5. 최종적으로 반환된 값은 cnt라는 변수에 합산되며, 그룹 단어의 개수를 출력하는 구성입니다.
| 문제 출처
https://www.acmicpc.net/problem/1316
1316번: 그룹 단어 체커
그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때
www.acmicpc.net
'코딩 | 알고리즘 & 문제풀이 > 백준_Backjoon' 카테고리의 다른 글
[C언어] Backjoon_Code 2292, 벌집 (0) | 2021.07.15 |
---|---|
[C언어] Backjoon_Code 1712, 손익분기점 (0) | 2021.07.14 |
[C언어] Backjoon_Code 2941, 크로아티아 알파벳 (0) | 2021.07.12 |
[C언어] Backjoon_Code 5622, 다이얼 (0) | 2021.07.11 |
[C언어] Backjoon_Code 2908, 상수 (0) | 2021.07.10 |