본문 바로가기

백준

5586 JOI와 IOI

비슷한 문제를 전에 푼 적이 있었다! 그래서 편하게 풀었다. 지금 어떤 상태인지를 판단한 다음 다음 단어를 확인하면서 상태를 바꿔나간다. 뭔가 파이썬에는 찾는게 더 편하게 돼있을 것 같은데 나는 씨쁠을 쓰고 씨쁠에는 관련 함수가 있는지 잘 모르겠다. 그래서 그냥 바로 생각나는 방법으로 풀었다. 

#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