https://www.acmicpc.net/problem/4659
4659번: 비밀번호 발음하기
좋은 패스워드를 만드는것은 어려운 일이다. 대부분의 사용자들은 buddy처럼 발음하기 좋고 기억하기 쉬운 패스워드를 원하나, 이런 패스워드들은 보안의 문제가 발생한다. 어떤 사이트들은 xvtp
www.acmicpc.net
풀이 과정
문자열을 조건에 맞춰 검사하고 조건에 부합하는지 하지 않는지를 출력하는 문제이다. 문자열에 모음이 있는지 cmps 문자열 "aeiou"에서 s[i]를 찾으며 판별한다. flag를 이용해 자음과 모음이 3개 연속으로 오는지 판단하고 만약 3개가 연속된다면 con을 false로 바꾸고 for문을 종료한다. 그리고 e와 o를 제외하고 연속으로 같은 두 글자가 오는지 판별한다. excep 문자열 "eo"에 포함된 문자인지 확인하고 포함되지 않은 문자가 연속해서 위치한다면 con을 false로 바꾸고 for문을 종료한다. 최종적으로 con 값에 맞춰 해당 문자열이 조건에 부합하는지 출력하게 된다.
느낀 점
문자열을 다루는 건 쉬워보이지만 종종 뇌정지가 올 때가 있다. 이번 문제를 통해서 문자열을 검사하는 기법에 대해 생각해 볼 수 있었다. 예외로 두는 문자들을 cmps와 excep과 같은 문자열에 담아 표현하는게, 조건이 변경 되었을 때 더 유연하게 사용할 수 있을거라고 생가한다.
#include<bits/stdc++.h>
using namespace std;
string s;
string cmps = "aeiou";
string excep = "eo";
int main() {
while (1) {
cin >> s;
if (s == "end") break;
bool aorb = false, con = false;
int check_a = 0, check_b = 0;
for (int i = 0; i < s.size(); i++) {
bool aflag = false;
//모음 유무 판별
if (cmps.find(s[i]) != string::npos) {
con = true;
aflag = true;
check_a++;
}
else {
aflag = false;
check_b++;
}
//자음 모음 연속 3개 이상 판별
if (check_a * check_b != 0) {
if (aflag) { check_a = 1; check_b = 0; }
else { check_a = 0; check_b = 1; }
}
else if (check_a > 2 || check_b > 2) {
con = false;
break;
}
//연속 두글자 판별 ee oo 제외
if (i < s.size() - 1 && s[i] == s[i + 1]) {
if (excep.find(s[i]) == string::npos) {
con = false;
break;
}
}
}
if (con) cout << "<" << s << "> is acceptable.\n";
else cout << "<" << s << "> is not acceptable.\n";
}
return 0;
}
'알고리즘 : C++ > BaekJoon' 카테고리의 다른 글
백준 2870번 - 수학 숙제 (0) | 2023.05.23 |
---|---|
백준 15686번 - 치킨 배달 (0) | 2023.05.23 |
백준 2910번 - 빈도 정렬 (1) | 2023.05.20 |
백준 2828번 - 사과 담기 게임 (0) | 2023.05.20 |
백준 1992번 - 쿼드트리 (0) | 2023.05.20 |