본문 바로가기
Develop/백준 (python)

[백준] 5525번: IOIOI (python)

by Tarra 2022. 4. 7.

5525번: IOIOI


문제 )

N+1개의 I와 N개의 O로 이루어져 있으면, I와 O이 교대로 나오는 문자열을 PN이라고 한다.

P_1 IOI
P_2 IOIOI
P_3 IOIOIOI
P_N IOIOI...OI (O가 N개)


I와 O로만 이루어진 문자열 S와 정수 N이 주어졌을 때, S안에 PN이 몇 군데 포함되어 있는지 구하는 프로그램을 작성하시오.

 

 

입력 :

첫째 줄에 N이 주어진다. 둘째 줄에는 S의 길이 M이 주어지며, 셋째 줄에 S가 주어진다.

 

 

 

출력 :

S에 P_N이 몇 군데 포함되어 있는지 출력한다.

 

제한:
1 ≤ N ≤ 1,000,000
2N+1 ≤ M ≤ 1,000,000
S는 I와 O로만 이루어져 있다.

 

 

 

 

 

풀이)

 

deque와 while문을 통해 deque가 모두 빌 때까지 popleft를 진행해주었다.

 

popleft를 진행하면서 연속된 p => IOIOIOIOI를 찾아 주고, 해당 p에서 만들 수 있는 pn의 개수를 cnt에 더해주었다.

 

여기서 p가 끊겼을 때, 연속된 I로 끊기게 되면 i=1,O=0으로 초기화 시켜주고,

 

연속된 O로 끊기게 되면 i=O=0으로 초기화 시켜주었다.

 

마지막은 완벽한 p로 deque를 모두 비우게 되면 0이 출력되게 되므로,

 

while문이 끝난 후 cnt의 개수를 한번 더 세주었다.

 

+ cnt에 더할 때에는 음수값이 더해지지 않도록 max를 이용했다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 앞에서부터 빼기 위해 deque를 사용했다.
from collections import deque
 
= int(input())
= int(input())
string = deque(input())
 
# i와 o의 개수를 세기 위함.
= 0
= 0
 
# 이전 문자인 prv를 체크해주기 위해 하나만 먼저 뺐다.
prv = string.popleft()
if prv == "I":
    i += 1
else:
    o += 1
 
# Pn을 세주기 위한 cnt
cnt = 0
while string:
    check = string.popleft()
    
    if prv == check == "I":
        cnt += max(i - n, 0)
        i = 1
        o = 0
 
    elif prv == check == "O":
        cnt += max(i - n, 0)
        i = 0
        o = 0
 
    elif prv == "I" and check == "O":
        o += 1
 
    elif prv == "O" and check == "I":
        i += 1
 
    prv = check
 
# 정확한 IOIO....IOI로 끝날 가능성이 있기 때문에
cnt += max(i - n, 0)
print(cnt)
cs

출처 : 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