본문 바로가기
백준/클래스

[1] [Class 3] - 백준 5525 IOIOI

by Riverandeye 2021. 1. 21.

www.acmicpc.net/problem/5525

 

5525번: IOIOI

첫째 줄에 N이 주어진다. 둘째 줄에는 S의 길이 M이 주어지며, 셋째 줄에 S가 주어진다. (1 ≤ N ≤ 1,000,000, 2N+1 ≤ M ≤ 1,000,000)

www.acmicpc.net

 

문자열 내에 특정 단어가 몇번 반복되냐를 계산하는 것이 목적인 문제입니다. 

 

제가 푼 방식은 이렇습니다.

찾아야 하는 단어가 I와 O의 반복이여서

한번 패턴이 매칭이 되면, 그 다음 앞의 2개만 더 IO면 되기 때문에

매칭에 성공할 시, 매칭된 단어의 갯수를 2를 줄이고 현재 위치에서 계속 판단하는 식으로 해서

시간 복잡도는 O(n) 으로 구성하였습니다. 

 

// 문자열 비교

#include <bits/stdc++.h>

using namespace std;

int main(){
  ios_base :: sync_with_stdio(false); 
  cin.tie(NULL);

  int N, L;
  string a;

  cin >> N >> L >> a;

  int count = 0;
  int curIdx = 0;
  int curMatch = 0;

  while(curIdx < a.size()){
    bool shouldBeI = (curMatch % 2) == 0;
    if(shouldBeI && a[curIdx] == 'I' || !shouldBeI && a[curIdx] == 'O'){
      curMatch += 1;
    }
    else if(!shouldBeI && a[curIdx] == 'I'){
      curMatch = 1;
    }
    else {
      curMatch = 0;
    }

    if(curMatch == N * 2 + 1){
      count += 1;
      curMatch -= 2;
    }

    curIdx += 1;
  }

  cout << count;
  return 0;
}

 

댓글