비슷한 문제를 전에 푼 적이 있었다! 그래서 편하게 풀었다. 지금 어떤 상태인지를 판단한 다음 다음 단어를 확인하면서 상태를 바꿔나간다. 뭔가 파이썬에는 찾는게 더 편하게 돼있을 것 같은데 나는 씨쁠을 쓰고 씨쁠에는 관련 함수가 있는지 잘 모르겠다. 그래서 그냥 바로 생각나는 방법으로 풀었다.
#include <iostream>
using namespace std;
int main() {
int jstate = 1, istate = 1;
int jcount = 0, icount = 0;
string str;
cin >> str;
for(int i = 0; i < str.length(); i++){
//JOI
if(str[i] == 'J' && jstate == 1){
jstate = 2;
}
else if(jstate == 2){
if(str[i] == 'O')
jstate = 3;
else if(str[i] != 'J')
jstate = 1;
}
else if(jstate == 3){
if(str[i] == 'I')
jcount++;
jstate = 1;
}
//IOI
if(str[i] == 'I' && istate == 1)
istate = 2;
else if(istate == 2){
if(str[i] == 'O')
istate = 3;
else if(str[i] != 'I')
istate = 1;
}
else if(istate == 3){
if(str[i] == 'I'){
icount++;
istate = 2;
}
else istate = 1;
}
}
printf("%d\n%d", jcount, icount);
}
그림은 간단했는데 상태를 확인하기 때문에 길이가 길어졌다.ㅋㅋ 아무튼 맞았음
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
cin >> s;
int ioi = 0, joi = 0;
for (int i = 0; i < s.size() - 2; i++)
{
string sub = s.substr(i, 3);
if (sub == "JOI")
joi++;
if (sub == "IOI")
ioi++;
}
printf("%d\n%d", joi, ioi);
return 0;
}
substr(i, 3) : 문자열 일부를 리턴한다
i : 첫번째 문자의 위치
3 : 부분 문자열의 길이
이렇게 하면 처음부터 문자 3개씩 잘라서 JOI와 IOI와 같은지 비교한다
비교할 때도 그냥 == 사용해서 비교하면 된다~!
'백준' 카테고리의 다른 글
1110 더하기 사이클 (0) | 2019.10.11 |
---|---|
2839 설탕 배달 (0) | 2019.10.11 |
11718 그대로 출력하기 (0) | 2019.10.11 |
1373 2진수 8진수 (0) | 2019.10.09 |
7567 그릇 (0) | 2019.10.09 |