-
[백준] 5525번 IOIOIAlgorithm Study/Python 2021. 9. 8. 22:20
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이 몇 군데 포함되어 있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. 둘째 줄에는 S의 길이 M이 주어지며, 셋째 줄에 S가 주어진다.
출력
S에 PN이 몇 군데 포함되어 있는지 출력한다.
제한
- 1 ≤ N ≤ 1,000,000
- 2N+1 ≤ M ≤ 1,000,000
- S는 I와 O로만 이루어져 있다.
풀이
실제로 P와 S를 구현해서 0번부터 탐색하면서 체크하였다.
N = int(input()) M = int(input()) S = input() P = 'IO'*N + 'I' answer = 0 for i in range(M - len(P)+1): if S[i] == 'I': if S[i:i+len(P)] == P: answer += 1 print(answer)
이 경우 서브테스크 1은 Input의 길이가 짧기 때문에 100 * 10000으로 통과할 수 있지만
서브테스크 2는 1000000 * 1000000이기 때문에 통과할 수 없다.서브테스크 2를 통과하기 위해서는 O(N) 이나 O(NlogN)정도의 시간 복잡도를 가지게 설계해야한다.
그럼 단일 for문을 이용해서 구현해야하는데 문자열이 규칙이 존재하기 때문에 단순 비교가 아니라 연산을 통해서 문자열을 찾아야한다.전체 코드
N = int(input()) M = int(input()) S = input() answer, i, count = 0, 0, 0 while i < (M - 1): if S[i:i+3] == 'IOI': i += 2 count += 1 if count == N: answer += 1 count -= 1 else: i += 1 count = 0 print(answer)
IOI가 몇 번 연속되는지 갯수만 찾아서 체크하게 되면 N * 3 정도의 시간으로 문제를 풀 수 있게 된다.
IOI가 발견되면 index를 2개 이동시키고 아닌 경우에는 index를 1개 이동 시키면서 검사한다.
'Algorithm Study > Python' 카테고리의 다른 글
[백준] 1946번 신입사원 (0) 2021.09.10 [백준] 9935번 문자열 폭발 (0) 2021.09.09 [백준] 11000 강의실 배정 (0) 2021.08.30 [백준] 22252번 정보 상인 호석 (0) 2021.08.24 [백준] 20040번 사이클 게임 (0) 2021.08.24