5525번 - IOIOI
2024-02-07
2분 분량
C++백준
문제 풀이 시간 : 1시간
문제 요약
- n+1개의 I와 n개의 O로 이루어진 문자열이 있다. (IOIOI…)
- I,O로 이루언진 문자열 S가 주어졌을 때, S안에 위의 문자열이 몇번 포함되어 있는지 구해라
문제 풀이
초기 코드
c++
#include <iostream>
#include <string>
using namespace std;
int main() {
int n, m, sum = 0;
string input;
string io = "I";
cin >> n >> m >> input;
for (int i = 0; i < n; i++) { //io문자열 만들기
io += "OI";
}
for (int i = 0; i < m; i++) { //몇번 포함 찾기
if (input[i] == 'I') {
if (input.substr(i, 2 * n + 1) == io) //문자열 잘라서 io와 같은지 비교
sum++;
}
}
cout << sum;
}위 코드는 50점을 받았다.
문자열의 최대 길이가 1,000,000이라 시간초과는 안나올거라고 생각했는데
1,000,000이 들어가면 시간초과가 나는 것 같다.
이유는 잘 모르겠지만
substr이 생각보다 많이 느린 듯하다.
그래서 다른 방법을 생각하다가 생각이 안나서 참고했다..
최종 코드
c++
#include <iostream>
#include <string>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, m, sum = 0;
string input;
cin >> n >> m >> input;
for (int i = 0; i < m; i++) {
int temp = 0;
if (input[i] == 'I') {
while (true) {
if (input[i + 1] != 'O' || input[i + 2] != 'I') //I를 이미 찾았으므로 뒤에 OI가 있는지 확인
break;
temp++;
if (temp == n) { //현재까지 찾은 io의 길이가 찾고자 하는 io의 길이와 같다면
temp--; //다음번 확인을 위해 길이 -1
sum++;
}
i += 2; //i+1, i+2를 확인 했으므로 i+2해주기
}
}
}
cout << sum;
}함께 읽으면 좋은 글
코딩 테스트2024-05-07
2186번 - 문자판
알파벳 문자가 한칸에 하나씩 적혀있는 NxM크기의 문자판이 있다. 임의의 칸에서 시작하여 상하좌우 K개의 칸까지 이동하며 문자를 모은다. 반드시 한 칸 이상 이동하며, 같은 자리에 머물 수 없다. 같은 칸을 여러 번 방문할 수 있다.
코딩 테스트2024-03-18
11657번 - 타임머신
N개의 도시가 있다. 한 도시에서 출발해 다른 도시에 도착하는 버스 M개가 있다. 각 버스는 A,B,C로 나타낸다. A-시작도시, B-도착도시, C-걸리는 시간 C는 양수가 아닐 수 있다.
코딩 테스트2024-02-20
16234번 - 인구 이동
NxN크기의 땅 한칸마다 나라가 존재한다. 국경선을 공유하는 두 나라의 인구 차이가 L명 이상, R명 이하라면 두 나라는 연합이 된다. 위의 조건에 해당하는 모든 나라가 연합이 되었다면 그 연합은 인구이동을 한다.
코딩 테스트2024-02-14
2096번 - 내려가기
n줄에 0이상 9이하의 숫자가 세개씩 적혀있다. 첫줄에서 가장 마지막줄까지 이동하면서 세가지 숫자 중 하나를 고른다. 마지막 줄에서 얻을 수 있는 최대 점수, 최소 점수를 구해라 이 문제는 dp로 풀 수 있겠다고 생각했다.