백준5525(파이썬) - IOIOI

resilient

·

2021. 6. 5. 15:18

728x90
반응형

https://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' 가 한번 나오면 n의 개수만큼 'OI'가 나온다는 점이다. 이 부분만 잘 생각해 보면 생각보다 간단하게 풀렸다.
  • 처음에는 n을 받으면 Pn을 아예 만들어 놓고, m개의 문자열을 한자리씩 돌리면서 Pn과 같으면 카운트 하는 방법을 사용했는데 시간초과가 발생하였다.
import sys
input = sys.stdin.readline

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

flag = 0
cnt = 0
ans = 0
i = 0
while i < m-2:
    if s[i] == 'I':
        flag = 1
    else:
        i += 1
    if flag == 1:
        #I가 나오면 그뒤에 OI 가 몇개가 나오는지에 따라 다르다. N개가 나와야한다.
        if s[i+1] == 'O' and s[i+2] == 'I':
            cnt += 1
            if cnt == n:
                ans += 1
                #OI 개수맨 세어주기 위해서 cnt가 n개면 ans += 1 해주고 cnt 한개 빼준다.
                cnt -= 1
            i += 2
        else:
            # I가 나와도 OI 가 안나오면 다 초기화 해주고 다음 I 카운트로 넘어가준다.
            cnt = 0
            flag = 0
            i += 1
print(ans)
######################################################################## 시간초과 코드
# num = n+(n+1)
# Pn = ""
# for i in range(1,num+1):
#     if i % 2 == 1:
#         Pn += "I"
#     elif i % 2 == 0:
#         Pn += "O"
# start = 0
# cnt = 0
# while start<m-num+1:
#     temp = ""
#     for i in range(start,start+num):
#         temp+=s[i]
#     if temp == Pn:
#         cnt+=1
#     start += 1
# print(cnt)
반응형