문제설명
알고리즘
<50점>
1. 입력받기
2. N으로 패턴 만들기
3. 주어진 문자열 S에서 N을 find함수로 찾기
4. 찾을때 마다 결과값 변수 1씩 증가, index를 업데이트
<100점>
1. 입력받기
2. I를 만날때 마다 바로 뒤에 OI가 있으면 k증가, 문자열 index를 2씩 증가
3. OI가 I이후로 N번 나오면 패턴 매칭이 완료된 것이므로 결과 값 증가 , k 감소
4. 결과값 출력
코드
#include<iostream>
#include<string>
using namespace std;
int main() {
int N, M,cnt=0;
cin >> N >> M;
string S;
cin >> S;
/*string val;
for (int i = 1; i <= 2 * N + 1; i++)//패턴 생성
{
if (i % 2 == 0)
val += 'O';
else
val += 'I';
}
for (int i = 0; i < M; i++)//다음 값 탐색
{
if (S.find(val, i)!=-1) {//문자열을 찾지 못한 경우가 아니면
i = S.find(val, i);//문자열 찾은 곳 저장
cnt++;//결과 값 증가
}
}*/
for (int i = 0; i < M; i++)
{
int k = 0;//패턴 수를 세기 위한 변수
if (S[i] == 'I') {
while (S[i + 1] == 'O' && S[i + 2] == 'I') {
k++;//IOI한번 발견
if (k == N)//IOI가 n번 발견된 경우
{
k--;
cnt++;
}
i += 2;
}
k = 0;
}
}
cout << cnt;
return 0;
}
이번 문제는 서브태스크가 존재하는 문제여서 50점, 100점 둘다 나왔다
주석으로 처리된 부분이 50점을 받았던 알고리즘이다
고찰
문자열을 토픽으로 한 문제였는데, find함수를 사용해서 했더니 50점을 맞았다
직접 계산하는 방식으로 바꾸니까 통과했는데 왜 더 빠른지는 잘 모르겠다
아무래도 find 함수에 대한 이해가 부족 해서 그런거같다
'Algorithm' 카테고리의 다른 글
[프로그래머스] 과일장수 (0) | 2022.11.14 |
---|---|
[백준 7569] 토마토 (0) | 2022.07.11 |
[백준 1992] 쿼드트리 (0) | 2022.07.10 |
[백준 14503] 로봇 청소기 (0) | 2022.07.03 |
[프로그래머스] 숫자 문자열과 영단어 (0) | 2022.07.01 |