cyphen156
백준-심화 1 1316 그룹 단어 체커 본문
각 문자가 연속해서 나타나는 경우를 체크해야 한다.
Ex) abbbcdde -> 그룹단어 a, bbb, c, dd, e
다음의 경우는 단어 중 일부가 연속되는 패턴이 깨졋기 때문에 그룹단어가 아니다.
Ex) aabbbcbdde -> 그룹단어 aa, c, dd, e / 그룹단어가 아닌 단어 bbb" "b
생각을 해보면 ... Case는 두개 정도 될 것 같다.
앞 문자와 뒤 문자를 같은 경우 -> 연속 판정
앞 문자와 뒤 문자가 다른 경우 -> 불연속 판정
단어 배열 쓰면 간단하겟다
제약사항
- all Case Must Be Close Together
- first Input value(N) Means Number of Word
- 0 < N <= 100
- each Word consist of lowerCase
- 0 < Word <= 100
주의 사항
없다.
CPP풀이
그룹 단어 체커_1316.cpp
/**
* 백준 그룹 단어 체커_1316
* 각 문자가 연속해서 나타나는 경우를 체크해야 한다.
* Ex) abbbcdde -> 그룹단어 a, bbb, c, dd, e
* 다음의 경우는 단어 중 일부가 연속되는 패턴이 깨졋기 때문에 그룹단어가 아니다.
* Ex) aabbbcbdde -> 그룹단어 aa, c, dd, e / 그룹단어가 아닌 단어 bbb" "b
*
* 제한사항
************************************************
* all Case Must Be Close Together *
* first Input value(N) Means Number of Word *
* 0 < N <= 100 *
* each Word consist of lowerCase *
* 0 < Word <= 100 *
************************************************
*
*
*
* 주의
*
*
* 풀이시간 40분
*/
#include <iostream>
using namespace std;
int main(void)
{
int numberOfCase, cnt = 0;
cin >> numberOfCase;
for (int i = 0; i < numberOfCase; ++i)
{
string str;
cin >> str;
bool isGroupWord = true;
bool alpha[26] = { 0 };
for (int j = 0; j < str.length(); ++j)
{
int index = str[j]-'a'; // 알파벳 위치 인덱싱
if (str[j] != str[j+1])
// 현재 단어랑 다음 단어가 다른 단어임 = 알파벳이 바뀌어 새로운 그룹단어를 형성함을 의미
{
if (alpha[index])
// 이미 한번 등장했던 그룹단어임 == 새로 등장할 때는 그룹단어가 아님을 의미
{
isGroupWord = false;
break;
}
alpha[index] = true;
}
}
if (isGroupWord)
{
++cnt;
}
}
cout << cnt;
return 0;
}
모든 예제 코드의 소스파일은 제 개인 깃허브 레포지토리 에 있습니다.
Workspace/알고리듬 풀이 at main · cyphen156/Workspace
Studying . Contribute to cyphen156/Workspace development by creating an account on GitHub.
github.com
Extra : 2년 전 코드
왜 이런식으로 풀어놨을까? 고민해봤다.
비교했을 때
- 단어의 첫 문자 체크포인트를 생략한다.
- 단어의 마지막 문자는 for조건문 j < str.length()에 의해 생략된다 -> 배열 인덱스를 넘어가는 연산을 하지 않는다.
그룹 단어 체커_1316_Legacy.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
int len, cnt = 0;
scanf("%d", &len);
for (int i = 0; i < len; i++) {
char s[101] = { 0 };
int alpha[26] = { 0 };
scanf("%s", s);
for (int j = 0; s[j] != '\0'; j++) {
if (alpha[s[j] - 'a'] == 0) {
alpha[s[j] - 'a'] = 1;
}
else if (alpha[s[j] - 'a'] == 1 && s[j] != s[j - 1]) {
alpha[s[j] - 'a'] = -1;
}
}
cnt++;
for (int j = 0; j < 26; j++) {
if (alpha[j] == -1) {
cnt--;
break;
}
}
}
printf("%d", cnt);
return 0;
}
'컴퓨터공학 > 알고리듬 풀이' 카테고리의 다른 글
백준-2차원 배열 2738 행렬 덧셈 (0) | 2025.02.03 |
---|---|
백준-심화 1 너의 평점은_25206 (0) | 2025.01.31 |
백준-심화 1 2941 크로아티아 알파벳 (0) | 2025.01.24 |
백준-심화 1 1157 단어 공부 (0) | 2025.01.24 |
백준-심화 1 10988 팰린드롬인지 확인하기 (0) | 2025.01.23 |