https://www.acmicpc.net/source/88126015
❔문제
🔄 문제 및 입출력 조건 파악
- "end"가 나올 때까지 계속 입력받기
- 각 패스워드 문자열 20글자 이하, 대문자로만 이뤄진 문자열
✏️ 문제풀이
문제에 주어진 세 가지 조건을 빠짐없이 구현하기만 하면 되는 문제입니다. 다른 방법은 없습니다.
첫 번째 조건: 모음(a,e,i,o,u) 하나를 반드시 포함하는지 검사하기
inline bool isVowel(char c) {
return (c=='a') || (c=='e') || (c=='i') || (c=='o') || (c=='u');
}
두 번째 조건:
- 모음 또는 자음이 3개 연속으로 오면 안 된다.
- 각 글자마자 모음인지 자음인지 판단합니다. 모음이면 모음 카운터 변수 증가, 자음이면 자음 카운터 변수 증가합니다.
- 두 카운터 변수 중 어느 것이든 3에 도달하면 품질 낮은 비밀번호 입니다.
세 번째 조건:
- 같은 글자가 연속적으로 두번 오면 안되나, ee 와 oo는 허용
- 각 글자를 입력받을 때마다 이전 글자와 비교합니다.
- 이전 글자와 지금 입력받은 글자가 같은데, 지금 입력받은 글자가 'e' 또는 'o'가 아니라면 품질 낮은 비밀번호 입니다.
if (i > 0 && str[i - 1] == str[i] && (str[i] != 'e' && str[i] != 'o')) {
result = false;
break;
}
📝 코드
#include <bits/stdc++.h>
using namespace std;
inline bool isVowel(char c) {
return (c=='a') || (c=='e') || (c=='i') || (c=='o') || (c=='u');
}
int main() {
//ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
string str;
while (cin >> str) {
if (str == "end"s) break;
bool result = true, vowelFlag = false;
int vowelCnt = 0, notVowelCnt = 0;
for (int i = 0, len = str.length(); i < len; ++i) {
// Step 1. 모음 여부 판단 (1번조건, 2번조건)
if (isVowel(str[i])) {
vowelFlag = true;
vowelCnt++;
notVowelCnt = 0;
} else {
notVowelCnt++;
vowelCnt = 0;
}
// step 2. 모음 또는 자음 연속 3번 나왔는지 검사하기 (2번조건)
if (vowelCnt >= 3 || notVowelCnt >= 3) {
result = false;
break;
}
// Step 3. 연속성 검사하기 'e', 'o'가 아닌데 2번 연속 (3번조건)
if (i > 0 && str[i - 1] == str[i] && (str[i] != 'e' && str[i] != 'o')) {
result = false;
break;
}
}
cout << "<" << str << "> is ";
if (!result || !vowelFlag) cout << "not ";
cout << "acceptable.\n";
}
}
🕧 결과
'Problem Solving' 카테고리의 다른 글
알고리즘 :: 백준 :: 10709 - 기상캐스터 (0) | 2025.01.07 |
---|---|
알고리즘 :: 백준 :: 2870 - 수학숙제 (0) | 2025.01.07 |
알고리즘 :: 백준 :: 2910 - 빈도 정렬 (0) | 2025.01.07 |
알고리즘 :: 백준 :: 2828 - 사과 담기 게임 (0) | 2025.01.07 |
알고리즘 :: 백준 :: 1992 - 쿼드트리 (0) | 2025.01.07 |