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이 몇 군데 포함되어 있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. 둘째 줄에는 S의 길이 M이 주어지며, 셋째 줄에 S가 주어진다.
출력
S에 $P_N$이 몇 군데 포함되어 있는지 출력한다.
제한
- 1 ≤ N ≤ 1,000,000
- 2N+1 ≤ M ≤ 1,000,000
- S는 I와 O로만 이루어져 있다.
출력
번호 | 배점 | 제한 |
1 | 50 | N $\le$ 100, M $\le$ 10 000. |
2 | 50 | 추가적인 제약 조건이 없다. |
728x90
예제 입력 1
1
13
OOIOIOIOIIOII
예제 출력 1
4
예제 입력 2
2
13
OOIOIOIOIIOII
예제 출력 2
2
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
char[] S = br.readLine().toCharArray();
int result = 0;
int start = 0, end = 0;
while(start < M && end < M - 2) {
if(S[start] != 'I') { // P의 시작 위치 찾기
start++;
end = start;
}
else {
int c = 0; // OI가 연속으로 오는 횟수
while(end < M - 2 && c != N) { // P_N 이 되는 문자열 찾기
if(S[end + 1] != 'O' || S[end + 2] !='I') {
start++;
end = start;
break;
}
end += 2;
c++;
}
if(c == N) { // P_N을 찾았다면
result++; // 답 증가시켜주고
while(end < M - 2) { // 뒤로 또 OI 문자열이 있다면 계속 답 증가시켜줌
if(S[end + 1] != 'O' || S[end + 2] !='I') break;
else {
end += 2;
result++;
}
}
start = end;
}
}
}
// 출력
System.out.println(result);
}
}
728x90
'Problem Solving > BOJ' 카테고리의 다른 글
[백준, BOJ 16928] 뱀과 사다리 게임 (java) (0) | 2023.03.13 |
---|---|
[백준, BOJ 6064] 카잉 달력 (java) (0) | 2023.03.13 |
[백준, BOJ 17626] Four Squares (java) (0) | 2023.03.13 |
[백준, BOJ 17219] 비밀번호 찾기 (java) (0) | 2023.03.13 |
[백준, BOJ 9019] DSLR (java) (0) | 2023.03.13 |