Problem Solving

알고리즘 :: 백준 :: 4659 - 비밀번호 발음하기

soreDemo 2025. 1. 7. 21:35

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";
	}
}

 

🔗 코드 링크

🕧 결과