접근
알고리즘 분류에는 문자열만 있지만, 나는 투포인터로 접근했다. 다른 사람들의 풀이를 보니, 한 칸씩 이동하며 연속된 IOI들의 개수를 세고 그 값이 N과 같아지면 answer를 카운팅하는 방식이다. 내가 실버 문제를 너무 복잡하게 생각한 것 같다. 아무튼 내 풀이 방법은 다음과 같다.
left와 right 포인터를 두고, 두 포인터의 거리가 2*n가 될 때까지 움직이며 조건을 확인한다. 기본적으로 left는 고정하고 right를 움직이는데, 한 칸 전의 문자와 현재 문자가 같다면 조건을 만족하지 않기 때문에 left 위치를 right로 확 옮겨준다.
만약 길이가 2*n을 만족하는 경우에는 left, 즉 시작 위치가 I로 시작하는 게 맞는지 확인한다. 아니라면 한 칸을 이동시켜 준다. 만약 맞다면 Pn의 조건을 만족하는 경우가 되는 것이다. answer의 값을 1 늘려주고, 이미 left~right 사이의 문자들은 IOI...IOI 를 만족하는 상태이기 때문에 바로 다음 I의 위치에서 시작할 수 있도록 left에 2를 더해줬다.
반례 모음은 이쪽 → https://www.acmicpc.net/board/view/88287
코드
package week8;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BJ5525 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int m = Integer.parseInt(br.readLine());
String input = br.readLine();
int left = 0, right = 1, answer = 0;
char pre, cur = input.charAt(left);
while(right < m){
pre = cur;
cur = input.charAt(right);
// 동일한 문자가 연속됨
if(pre == cur) left = right;
// n 조건을 만족하는 길이가 됨
if(right - left == 2*n){
if(input.charAt(left) == 'O'){
left++;
}
else {
answer++;
left += 2;
}
}
right++;
}
System.out.println(answer);
}
}
'Algorithm' 카테고리의 다른 글
[백준] 11286: 절댓값 힙 JAVA (0) | 2023.03.20 |
---|---|
[백준] 1713: 후보 추천하기 JAVA (0) | 2023.03.14 |
[백준] 1541: 잃어버린 괄호 JAVA (0) | 2023.03.03 |
[백준] 17472: 다리 만들기 2 JAVA (0) | 2023.02.27 |
[백준] 10423: 전기가 부족해 JAVA (0) | 2023.02.27 |