티스토리 뷰
#include <stdio.h>
int main(void)
{
int n;
scanf("%d", &n);
int m;
scanf("%d", &m);
char arr[m+1];
scanf("%s", arr); //문자열 입력
int cnt = 0;
int len = 0; //P(n)을 이루는 문자열의 길이
int ans = 0;
for(int i=0; i<m; i++) {
if(len == 0 && arr[i] == 'I') len++; //첫번째 I, P()의 길이를 1로 시작한다.
else if(len & 1 && arr[i]=='O') len++; //바로앞에 I가 있다면 P()의 길이를 늘린다.
else if(len%2==0 && len>=2 && arr[i]=='I') { //P()의 길이가 2 이상이며, 짝수 길이이며, 이전이 O이고, 이번것이 I 일때 P()의 길이를 1 늘린다.
len++;
cnt++;
} else if(len>=2) { //P()을 더이상 길게 할 수 없는 경우, 이전까지의 P()의 길이를 이용하여, P(n)의 개수를 구한다.
if(cnt >= n) ans += (1 + (cnt-n));
cnt = 0;
len = 0;
}
if(len == 0 && arr[i] == 'I') len++; //첫번째 I, P()의 길이를 1로 시작한다.
//28줄 코드가 18줄에도 있고 여기에도 있는 이유는 IOIIOI 이런 경우 처럼
//P()이 더이상 안 만들어지는 경우에는 ...OO... 나 ...II...가 있으며, ...II...인 경우 두번째 I에서 새로운 P()이 시작 할 수 있기 때문이다
}
//반복문이 끝나버려서, 구한 P()을 이용하여 P(n)의 개수를 ans에 누적하지 못한 경우를 위해 적었다.
if(cnt >= n) ans += (1 + (cnt-n));
printf("%d", ans);
return 0;
}
IOI.... 개수 구하는 법
하나의 문자에서 IOI....가 어디까지 되는지를 구하고,
다음 문자에서 IOI...가 어디까지 되는지를 구하고, ...
이런식으로 문자 한개씩을 시작점으로 보고 만들 수 있는 IOI를 구해도 되나, -> 길이가 늘어나면 걸리는 시간이 많이 걸린다.
---------------------------------------------
IOIOI = P(2)은 IOI = P(1)가 2개이다.
IOIOIOI = P(3)은 IOIOI = P(2)가 2개, IOI = P(1) 가 3개이다.
즉
P(n) 1개 = P(n-1)+1 개이며
P(n) 1개 = P(m) n-m+1개 이다. (단 n,m 은 자연수 및 n>=m)
이 경우엔 IOI....로 이루어진 문자열을 구하면(P()) 바로 P(n)으로 변환해서 누적하면 한번만 모든 문자열을 훍기만 하면
구하는 시간이 N(문자열의 길이) 밖에 걸리지 않을 정도로 위보다 빨리 구할 수 있게 된다.
'c언어 > BAEKJOON' 카테고리의 다른 글
c언어 1834번 나머지와 몫이 같은 수 (백준) (0) | 2023.03.06 |
---|---|
c언어 1715번 카드정렬하기 (0) | 2023.03.04 |
c언어 3190번 뱀 (백준) (0) | 2023.03.01 |
c언어 26042번 식당 입구 대기 줄 (백준) (0) | 2023.02.28 |
c언어 17419번 비트가 넘쳐흘러 (백준) (0) | 2023.02.23 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 1835번
- 플로이드
- 오프라인 쿼리
- 최대공약수
- 최소 스패닝 트리
- union
- DP
- 덱
- 누적 합
- C언어
- DFS
- java
- 브루트포스
- C++
- 백준
- PASCAL
- 그래프
- 세그먼트 트리
- Segment Tree
- Lazy Propagation
- 스택
- 1835
- BFS
- Krustal
- 그리디
- XOR
- 정렬
- 누적합
- 기하학
- find
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함