728x90
반응형
프로그래머스 카카오 비밀번호 추천 문제랑 비슷한 문제였다. 난이도는 훨씬 쉽지만 조건을 모두 맞추는 게 조금 까다로웠다.
그래도 순서대로 조건을 쓰니 수월하게 풀렸다.
알고리즘 설계
- 각 알파벳들이 최근에 나타난 위치를 저장하는 int형 배열을 이용해 현재 위치 - 배열 위치 의 차가 1이면 연속됨을 이용해 3번 조건을 체크한다.
if (alphabets[idx] != -1 && i - alphabets[idx] == 1)
{
if (!(s[i] == 'e' || s[i] == 'o'))
{
fail = true;
}
}
2. 모음이면 자음 카운트를 초기화하고 모음 카운트를 올려주고, 자음이면 그 반대로 해준다. 자음 혹은 모음 카운트가 3이 넘어가면 2번 조건에 위배됨을 이용했다.
if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u')
{
consonant++;
vowel = 0;
}
else
{
vowel++;
consonant = 0;
}
if (vowel >= 3 || consonant >= 3)
{
fail = true;
}
3. 모음일 때 true가 되는 bool형 변수를 만들어주고, 모음이 하나라도 있는지 체크할 때 이용한다.
if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u')
{
consonant++;
vowel = 0;
}
//...
// 반복문이 끝났을 때
if (fail || !hasVowel)
{
cout << "<" << s << "> is not acceptable." << endl;
}
else
{
cout << "<" << s << "> is acceptable." << endl;
}
전체 코드
#include<iostream>
#include<set>
using namespace std;
int main()
{
while (true)
{
string s;
int alphabets[26], consonant = 0, vowel = 0;
bool fail = false, hasVowel = false;
cin >> s;
if (s == "end") break;
// 초기화
for (int i = 0; i < 26; i++)
alphabets[i] = -1;
for (int i = 0; i < s.size(); i++)
{
int idx = s[i] - 'a';
// 연속되는 게 있고 e나 o가 아니라면
if (alphabets[idx] != -1 && i - alphabets[idx] == 1)
{
if (!(s[i] == 'e' || s[i] == 'o'))
{
fail = true;
}
}
// 모음이라면
if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u')
{
consonant++;
vowel = 0;
hasVowel = true;
}
else
{
vowel++;
consonant = 0;
}
if (vowel >= 3 || consonant >= 3)
{
fail = true;
}
alphabets[idx] = i;
}
// 미리 실패이거나 모음이 하나라도 없다면
if (fail || !hasVowel)
{
cout << "<" << s << "> is not acceptable." << endl;
}
else
{
cout << "<" << s << "> is acceptable." << endl;
}
}
}
조건을 하나 하나 정복해가며 푸는 게 재미있었던 문제!
역시 문자열 문제는 게임같이 퀘스트를 하나 하나 수행해가는 재미에 푸는 것 같다.
728x90
반응형
'알고리즘 문제풀이 > 문자열' 카테고리의 다른 글
[백준][C++] 17609 회문 (0) | 2022.11.04 |
---|---|
[백준][C++] 9342 염색체 (0) | 2022.11.04 |
[백준][C++] 16171. 나는 친구가 적다 (Small) (0) | 2022.11.04 |
[백준][C++] 9046 복호화 (0) | 2022.11.04 |
[백준][C++] 3029 경고 (0) | 2022.11.04 |