728x90
반응형
https://www.acmicpc.net/problem/5525
문제
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이 몇 군데 포함되어 있는지 구하는 프로그램을 작성하시오.
서브테스크 문제로 처음 내가 생각한 해결법으로는 50점을 받았다
처음에는 투포인터로 각 길이만큼 확인하려했고, 두번째로는 pattern을 지정해주어 확인해주는 방식으로 하였다.
하지만 위 해결법들로는 시간 복잡도 내 해결이 불가능했다.
시간복잡도 내 해결하는 방법은
"IOI"라는 문자열을 하나의 Pattern으로 두어 인덱스 1부터 시작해서 s[i-1], s[i], s[i+1]이 위 패턴과 일치하는지 확인한다. 만약 일치하면 패턴의 개수를 세어주는 변수를 +1 해주고 패턴의 개수가 N개가 되면 P(n)에 부합하는 문자열이 된다. 그러므로 정답을 체크해주고 패턴은 다시 -1해준다. 이렇게 되면 O(m)의 시간복잡도로 문제를 해결할 수 있다
import sys
import re
N = int(sys.stdin.readline())
M = int(sys.stdin.readline())
S = sys.stdin.readline()
cnt = 0
pattern = 0
i = 1
while i < M-1:
if S[i-1] == 'I' and S[i] == 'O' and S[i+1] == 'I':
pattern += 1
if pattern == N:
pattern -= 1
cnt += 1
i += 1
else:
pattern = 0
i += 1
print(cnt)
728x90
반응형
'BOJ > 문자열 (해시,맵)' 카테고리의 다른 글
[Python] 백준 - 9536번 : 여우는 어떻게 울지? (0) | 2022.05.14 |
---|---|
[Python] 백준 - 6996번 : 애너그램 (0) | 2021.12.24 |
[Python] 백준 - 11365번 : !밀비 급일 (0) | 2021.10.09 |
[Python] 백준 - 3029번 : 경고 (0) | 2021.10.09 |
[Python] 백준 - 1302번 : 베스트셀러 (0) | 2021.09.14 |