728x90
SMALL
백준 문제 풀이: 5525 [IOIOI]
문제 링크: https://www.acmicpc.net/problem/5525
문제 설명:
길이 m의 문자열 s가 주어졌을 때, 패턴 P(n) = IOI...OI (IOI가 n번 반복되는 문자열)이 s 안에 몇 번 포함되어 있는지 계산하는 문제입니다. 연속으로 나타나는 IOI의 패턴에서 최소 n개의 IOI가 포함된 경우만 카운트합니다.
문제 해결 코드
#include <iostream>
using namespace std;
int main() {
int n, m;
string s;
cin >> n;
cin >> m;
cin >> s;
int nCnt = 0;
int ansCount = 0;
for (int i = 1; i < m - 1; i++) {
if (s[i] == 'O') {
if (s[i - 1] == 'I' && s[i + 1] == 'I') {
nCnt++;
if (nCnt >= n) {
ansCount++;
}
i++; // OI가 매칭된 경우 다음 I로 이동
} else {
nCnt = 0;
}
} else {
nCnt = 0; // 패턴이 깨지면 nCnt 초기화
}
}
cout << ansCount;
}
코드 설명
- 핵심 아이디어: 문자열 s를 순회하며 'IOI' 패턴을 탐색합니다. 패턴이 연속으로 나타나면 카운트를 누적하며, 패턴이 깨질 경우 카운트를 초기화합니다.
- 구현 세부사항:
nCnt
: 현재까지 발견한 연속된 IOI 패턴의 개수입니다.- IOI 패턴이 n번 이상 발견될 때마다
ansCount
를 증가시킵니다. - 패턴이 끝나거나 깨질 때
nCnt
를 초기화합니다. - 패턴의 특성상, 'IOI'가 매칭되면 인덱스를 한 칸 더 건너뜁니다.
- 시간 복잡도: O(m)
- 문자열 s를 한 번 순회하며 패턴을 찾기 때문에 선형 시간 복잡도를 가집니다.
결과
패턴 P(n)을 포함하는 횟수를 효율적으로 계산하며, 입력 크기가 커져도 빠르게 동작합니다. 이 코드로 정확하고 최적화된 결과를 얻을 수 있습니다.
다른 접근 방식이나 궁금한 점이 있다면 댓글로 공유해주세요!
728x90
LIST
'BAEKJOON > 문자열' 카테고리의 다른 글
백준 2789번 [유학 금지](C++) -yes6686- 티스토리 (0) | 2024.05.06 |
---|---|
백준 1181번 [단어 정렬](C++)-yes6686- 티스토리 (1) | 2023.12.21 |
백준 2675번 [문자열 반복](C++)-yes6686- 티스토리 (1) | 2023.12.18 |
백준 1157번 [단어 공부](C++)-yes6686- 티스토리 (0) | 2023.12.16 |
백준 1152번 [단어의 개수](C++)-yes6686- 티스토리 (0) | 2023.12.16 |