백준 13022번 - 늑대와 올바른 단어(실버 2)
https://www.acmicpc.net/problem/13022
풀이
입력된 문자열이 규칙 1, 2를 충족시키는지 검사해야 한다.
규칙1: w, o, l, f 가 n 번 나온 단어는 올바른 단어(순서는 w, o, l, f 로 나와야함)
규칙2: 올바른 단어 2개를 이은 단어도 올바른 단어
규칙 1 을 만족시킬수 있는 단어는 wolf, wwoollff.. 등이 있다.
우선 문자가 반복된 횟수를 구한다. (wcnt 에 저장)
문자가 바뀐 지점 인덱스 +1 을 저장해서 구했다.
for (int i = 0; i < str.size(); i++)
{
// 문자가 변한 구간
if (i>=1 && str[i]!= str[i-1])
{
wcnt = i;
break;
}
}
이제 각 문자별로 등장횟수를 카운트한다.
저는 'f' 를 기준으로 f다음에 f를 제외한 다른 문자가 나오면
각 문자별 등장 횟수가 wcnt 와 일치 하는지 검사했습니다.
여기서 1번 조건을 충족시키려면 현재까지 구간의 문자열은
w x (wcnt 횟수 반복) + o x (wcnt 횟수 반복) + l x (wcnt 횟수 반복) + f x (wcnt 횟수 반복) 입니다.
만약 현재 구간까지 문자열이 1번 조건을 충족시킨다면, 다음 구간도 검사해야겠죠.
남은 구간만 다시 문자열을 동일하게 검사하면 됩니다.
저는 replace 로 현재검사한 구간을 제거하고
아직 문자가 남아있다면 재귀시켜서 다시 검사했습니다.
전체 코드
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
bool isWolf(string str)
{
int wcnt = 0;
// 각각 문자열 카운트
int w = 0;
int o = 0;
int l = 0;
int f = 0;
for (int i = 0; i < str.size(); i++)
{
// 문자가 변한 구간
if (i>=1 && str[i]!= str[i-1])
{
wcnt = i;
break;
}
}
for (int i = 0; i < str.size(); i++)
{
if (str[i] == 'w')
{
w++;
}
if (str[i] == 'o')
{
o++;
}
if (str[i] == 'l')
{
l++;
}
if (str[i] == 'f')
{
f++;
// f 연속 끝나면 발동
// 문자열 인덱스에러 방지
if (i == str.size() - 1 || (i < str.size() - 1 && str[i] != str[i + 1]))
{
// 모든 글자의 수가 같으면
if (wcnt == w && wcnt == o && wcnt == l && wcnt == f)
{
string wolfstr = "wolf";
string findstr = "";
for (int j = 0; j < wolfstr.size(); j++)
{
for (int k = 0; k < wcnt; k++)
{
findstr += wolfstr[j];
}
}
// findstr 이 있는지 확인
int pos = str.find(findstr);
// 없으면 리턴시킴
if (pos== string::npos)
{
return false;
}
// 문자 제거
str = str.replace(str.find(findstr), findstr.length(), "");
if (str.size() == 0)
{
return true;
}
else
{
// 다시 문자 검사
return isWolf(str);
}
}
else
{
return false;
}
}
}
}
return false;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int result = 0;
string str;
cin >> str;
cout << isWolf(str);
return 0;
}
'백준 > 실버' 카테고리의 다른 글
백준 [2108] - 통계학 (c++) (0) | 2025.02.04 |
---|---|
백준[4134] - 다음 소수 (c++) (0) | 2025.01.24 |
백준 [1620]- 나는야 포켓몬 마스터 이다솜 (C++) (0) | 2025.01.09 |