#define _CRT_SECURE_NO_WARNINGS
#include <iostream> // cpp
#include <string>
// 자료 구조
#include <map>
using namespace std;
string str;
int idx[4] = { 'w', 'o', 'l', 'f' };
int cnt[4]{ 0, }; // w o l f
map<char, int> M;
void INPUT()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> str;
M.insert({ 'w', 0 });
M.insert({ 'o', 1 });
M.insert({ 'l', 2 });
M.insert({ 'f', 3 });
M.insert({ 'L', 4 });
}
bool allSame(char e)
{// w o l f 순서 지켜지고있는지 확인 && 모두 같은 갯수인지 확인
int lastIdx = M[e];
for (int i = 0; i < lastIdx - 1; i++)
if (cnt[i] != cnt[i + 1])
return false;
return true;
}
void init()
{// 올바른 부분 문자열을 발견하면 cnt 초기화
for (int i = 0; i < 4; i++) cnt[M[idx[i]]] = 0;
}
void SOLVE()
{
// 첫 글자가 w가 아니면 0 출력
if (str[0] == 'w') cnt[M['w']] = 1;
else { cout << 0; return; }
for (int i = 1; i < str.length(); i++)
{
// w가 없는데 다른 문자를 읽은 경우
if (cnt[M['w']] == 0 && str[i] != 'w')
{
cout << 0;
return;
}
// 앞 글자와 다른 글자일 경우
if (str[i] != str[i - 1])
{
// 순서가 지켜졌고, 모든 갯수가 같은 경우
if (allSame(str[i]))
{
// w를 읽었다면 올바른 부분 문자열을 발견한 것이므로
if (str[i] == 'w')
{
// cnt 초기화 후 cnt 갱신
init();
cnt[M['w']] = 1;
}
// w가 아니라면 갯수 갱신
else cnt[M[str[i]]]++;
}
// 순서가 지켜지지 않았거나 갯수가 맞지 않는다면 0 출력
else { cout << 0; return; }
}
// 앞 글자와 같을 경우 갯수 갱신
else cnt[M[str[i]]]++;
}
// 갯수가 모두 같은지 확인
if (allSame('L')) cout << 1;
else cout << 0;
}
int main()
{
INPUT();
SOLVE();
}
GOLD5 미만 난이도는 알고리즘 및 풀이 설명을 주석으로 대체합니다.
주석을 참고해주세요.