Algorithm Problems

[백준][Python] 5525번 IOIOI - 문자열

WakaraNai 2021. 8. 4. 01:12
728x90
반응형

https://www.acmicpc.net/problem/5525

 

5525번: IOIOI

N+1개의 I와 N개의 O로 이루어져 있으면, I와 O이 교대로 나오는 문자열을 PN이라고 한다. P1 IOI P2 IOIOI P3 IOIOIOI PN IOIOI...OI (O가 N개) I와 O로만 이루어진 문자열 S와 정수 N이 주어졌을 때, S안에 PN이 몇

www.acmicpc.net

 

Python

import sys
input = sys.stdin.readline

n = int(input())
m = int(input())
s = input().rstrip()

ans = 0

length = 1
for i in range(s.find('I')+1, m): # I가 처음으로 나오는 곳부터 시작
    if length == 0 and s[i] == "I":  # 새롭게 수열 계산해야 할 시점인지 판단
        length = 1
        continue

    if s[i] != s[i-1]:
        length += 1
    else:
        if s[i-1] != "I": # IOIO 처럼 O가 붙어서 끝나는 경우 길이-1
            length -= 1
        if length >= (1+2*n): # Pn보다 짧은 수열이면 패스
            ans += (length - (1+2*n))//2 + 1 # 그 차이 중 I개만 선택
        length = 1 if s[i] == "I" else 0 # 곧바로 새로운 수열이 시작되는지 확인하기

# IOIOI처럼 단 한 번도 같은 경우 없이 끝나는 상황까지 처리하기
if length >= (1+2*n):
    if s[-1] != "I":
        length -= 1
    ans += (length - (1+2*n))//2 + 1

print(ans)
728x90
반응형