이우의 개발일지
[C++] 백준 1316번 그룹 단어 체커 본문
문제 1316
https://www.acmicpc.net/problem/1316
문제 코드
#include<iostream>
using namespace std;
#include<string>
int main()
{
int num, cnt = 0;
cin >> num;
for (int i = 0; i < num; i++)
{
string str;
cin >> str;
int check = 0;
for (int j = 0; j < str.length() - 1; j++)
{
if (str[j] != str[j + 1] && str.substr(j + 1).find(str[j]) != std::string::npos)
{
check = 1;
break;
}
}
if (check == 0) cnt += 1;
}
cout << cnt << endl;
return 0;
}
구현 문제 중 그룹단어체커는 어려운 문제는 아니다.
다만 연속된 단어 이외에 aba 처럼 연속되지 않은 단어가 중복되서 나오는 것을 체크하는 것이 중요하다.
if (str[j] != str[j + 1] && str.substr(j + 1).find(str[j]) != std::string::npos)
{
check = 1;
break;
}
이 부분이 메인인데, str[j]와 str[j+1]이 연속되지 않으면서, 똑같은 문자가 나온다면 이건 카운트 할 수 없다.
라는 코드이다.
여기서 substr(j+1)은 str의 j+1부터 끝까지 추출해서 find(str[j]), 즉 str[j]와 같은 걸 찾겠단 말입니다.
std::string::npos는 C++ 표준 라이브러리에서 std::string::find() 함수가 특정 문자열 또는 문자를 찾지 못했을 때 반환하는 정적 상수이다.
같은 것을 못찾았을 때 카운드 한다는 말이다.
이렇게 위처럼 풀면 간단하게 풀 수 있다.
나는 처음에 아래처럼 삼중 for문을 돌려서 일일히 체크할려했다,,
생고생을 한 코딩.. ㅋㅋ 암튼 밑에도 정답이긴 하다.
#include <iostream>
#include <vector>
#include<string>
using namespace std;
int main() {
int Num;
cin >> Num;
int result = Num;
vector<string> a;
int flag = 0;
int same = 0;
for (int i = 0; i < Num; i++) {
string ex;
cin >> ex;
a.push_back(ex);
}
for (int i = 0; i < Num; i++) {
int* array = new int[a[i].size()];
for (int j = 0; j < a[i].size(); j++) {
array[j] = a[i][j];
//cout << array[j] << endl;
}
for (int j = 0; j < a[i].size()-1; j++) {
for (int k = 1; k < a[i].size(); k++) {
if (array[j] == array[k]) {
if (j == k - 1) continue;
else if (array[k] == array[k - 1]) continue;
else {
result--;
flag = 1;
break;
}
}
}
if (flag == 1) {
flag = 0;
break;
}
}
}
cout << result << endl;
return 0;
}
반응형
'Coding' 카테고리의 다른 글
[백준/C++] 1193번 분수찾기 코딩 (0) | 2024.05.15 |
---|---|
[백준/C++] 2941번 크로아티아 알파벳 (0) | 2024.05.15 |
[C++] 백준 10828번 스택 (0) | 2024.05.10 |
[C/C++] map 함수 / STL 함수 (0) | 2024.05.07 |
[C/C++] stringstream 사용법 (0) | 2024.05.07 |