문제
url : https://www.acmicpc.net/problem/4659
입력 및 출력
풀이
변수, 함수 선언 및 초기화
- 해당 문제는 3가지 조건을 모두 통과하면 “acceptable”, 통과하지 못한다면 “not acceptable” 문자열을 출력하도록 해야 한다.
- 모음과 자음의 개수에 따라 주어진 조건을 적절하게 판별해 내는 것이 중요한 문제이다.
string s; // 입력받을 테스트 문자열
int lcnt, vcnt // 연속한 모음, 자음의 개수를 저장하는 변수
bool isVowel(int idx){
return (idx == 'a' || idx == 'e' || idx == 'i' || idx == 'o' || idx == 'u');
} // 입력된 문자가 모음인지 확인하는 함수
- 테스트 케이스는 기저조건을 만족할 때 까지 반복한다.
- 기저조건을 정의한다. (입력받은 문자열이 “end” 인 경우 종료해야 한다.)
- 기저조건 이후 필요한 각 변수를 초기화 한다.
lcnt = vcnt = 0; // 각 테스트 케이스마다 모음, 자음의 개수는 0으로 초기화
bool flag = 0; // 최종적으로 조건을 만족하는지 체크
bool is_include_v = 0; // 모음이 하나 이상 포함되어 있는지 체크
int prev = -1; // 이전 인덱스와 비교하기 위해 필요한 변수
- 입력받은 테스트 케이스의 모든 문자를 탐색하면서 주어진 조건을 만족하는지 확인한다.
조건 체크하기
- 테스트 케이스 문자열의 모든 문자를 순회한다.
- 현재 문자가 모음인지 체크한다.
- 모음인 경우, 모음의 개수(lcnt)를 1 증가, 자음의 개수(vcnt) = 0, 모음이 하나 이상 포함되어 있으므로 is_include_v = 1;
- 자음인 경우, 자음의 개수(vcnt)를 1증가, 모음의 개수(lcnt) = 0
- 모음이나 자음이 3개이상 연속하는지 체크한다.
- 3개 이상 연속하는 경우 “unacceptable” 하므로 flag = 1;
- 같은 글자가 연속으로 2번 오는지 체크(단, ee나 oo는 제외)
- 2번 오는 경우, “unacceptable” 하므로 flag = 1;
// Tip. 이전 인덱스와 비교하는 방법
for(int i=0;i<s.size();i++){
idx = i; // 현재 인덱스나 상태를 저장
... // 여기에 로직을 삽입
prev = idx; // 이전 노드를 업데이트
}
- 테스트 케이스 문자열에 모음이 하나도 존재하지 않는 경우, “unacceptable” 하므로 flag = 1;
for (int i = 0; i < s.size(); i++)
{
int idx = s[i];
// 모음인 경우
if (isVowel(idx))
{
lcnt++, vcnt = 0, is_include_v = 1; // 모음이 하나이상 포함되어 있으므로 체크
}
else
{
vcnt++, lcnt = 0;
}
// 모음이나 자음이 3개이상 연속하는지 체크
if (lcnt == 3 || vcnt == 3)
{
flag = 1;
}
// 같은 글자가 연속으로 2번오는지 체크(단, ee나 oo는 예외)
if (i >= 1 && (prev == idx) && (idx != 'e' && idx != 'o'))
{
flag = 1;
}
prev = idx;
}
// 모음이 하나도 없는 경우
if (is_include_v == 0)
{
flag = 1;
}
...
결과 출력
- 해당 문제는 3가지 조건을 모두 통과하면(flag = 0) “acceptable”, 통과하지 못한다면(flag = 1) “not acceptable” 문자열을 출력하도록 한다.
if (flag)
{
cout << "<" << s << "> is not acceptable." << '\n';
}
else
{
cout << "<" << s << "> is acceptable." << '\n';
}
전체 코드
#include <bits/stdc++.h>
using namespace std;
string s;
int lcnt, vcnt;
bool isVowel(int idx)
{
return (idx == 'a' || idx == 'e' || idx == 'i' || idx == 'o' || idx == 'u');
}
int main()
{
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
while (1)
{
cin >> s;
// 기저 조건
if (s == "end")
{
break;
}
lcnt = vcnt = 0;
bool flag = 0;
bool is_include_v = 0;
int prev = -1;
for (int i = 0; i < s.size(); i++)
{
int idx = s[i];
// 모음인 경우
if (isVowel(idx))
{
lcnt++, vcnt = 0, is_include_v = 1; // 모음이 하나이상 포함되어 있으므로 체크
}
else
{
vcnt++, lcnt = 0;
}
// 모음이나 자음이 3개이상 연속하는지 체크
if (lcnt == 3 || vcnt == 3)
{
flag = 1;
}
// 같은 글자가 연속으로 2번오는지 체크(단, ee나 oo는 예외)
if (i >= 1 && (prev == idx) && (idx != 'e' && idx != 'o'))
{
flag = 1;
}
prev = idx;
}
// 모음이 하나도 없는 경우
if (is_include_v == 0)
{
flag = 1;
}
if (flag)
{
cout << "<" << s << "> is not acceptable." << '\n';
}
else
{
cout << "<" << s << "> is acceptable." << '\n';
}
}
return 0;
}
결과
'백준' 카테고리의 다른 글
[C++] 백준 10709번 풀이 (기상캐스터) (0) | 2024.08.16 |
---|---|
[C++] 백준 2870번 풀이 (수학 숙제) (0) | 2024.08.16 |