백준
백준 2941 c++ 풀이
ris
2024. 7. 9. 20:13
이번 문제는 입력받은 문자열 속 특정 문자열을 감지해내는 문제였다.
방법은 여러가지겠지만 생각나는 방법은 두 가지 정도였다.
하나는 if문을 사용하는 방법
다른 하나는 string 라이브러리의 find를 사용하는 방법이다.
그래서 둘 다 했다.
string 라이브러리의 find를 사용한 풀이
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main(){
size_t pos;
vector<string> alpha = {"c=", "c-","dz=","d-","lj","nj" ,"s=" , "z="}; // 확인용 vector로 하면 python의 list 처럼 할 수 있음.
string str;
cin >> str;
for(int i = 0; i < alpha.size(); i++){ // 위 하나씩 계산
while(1){ // 두 개 이상일 시에 재검
pos = str.find(alpha[i]); // 하나씩 계산
if(pos == string::npos) break;
str.replace(pos, alpha[i].length(), "#"); // 처리
}
}
cout << str.length();
return 0;
}
이해를 돕기 위해 주석을 달았다.
허나 부족할 수 있기에 설명을 하겠다.
내가 사용한 방법은 find를 사용해 특정 문자열을 감지 및 index값을 받아내고 본 문자열을 # (다른 것도 됨) 으로 바꿔 출력할 때 길이를 측정한 값을 넣는 방법을 사용했다.
복잡해보이지만 그냥 find와 replace를 적당히 쓰면 됐다.
if 문을 사용한 풀이
#include<iostream>
using namespace std;
int main(){
string str;
cin >> str;
size_t i = 0;
int cnt = 0;
while(i < str.length()){
if(str[i] == 'c'){
if(str[i+1] == '=' || str[i+1] == '-'){
i++;
}
}
if(str[i] == 'd'){
if(str[i+1] == 'z' && str[i+2] == '='){
i += 2;
}
if(str[i+1] == '-'){
i++;
}
}
if(str[i] == 'l' && str[i+1] == 'j'){
i++;
}
if(str[i] == 's' && str[i+1] == '='){
i++;
}
if(str[i] == 'z' && str[i+1] == '='){
i++;
}
if(str[i] == 'n' && str[i+1] == 'j'){
i++;
}
cnt++;
i++;
}
cout << cnt;
return 0;
}
간단하지만 복잡한 이상한 풀이였다.
가능한 풀이다만 권장하진 않는다.
필자는 이 풀이에만 30분을 썼다.
풀이를 하자면 이 방법은 문자열의 길이만큼 반복하며 문자열을 if문으로 하나씩 감지하며 감지된다면 감지하는 index를 한칸씩 옮기는 방식이다. 그리고 마지막에 횟수를 더하는 방식이다.
왜 이런 방식을 취했냐면 크로아티아 알파벳이 연속해서 겹치는 부분이 없기 때문이다.
만일 연속해서 겹쳤다면 한칸씩 옮겼을 때 중복으로 감지될 수 있기 때문이다.
그렇기에 한칸씩 옮기면 반복되지 않고 감지되었지만 처리되지 않은 index는 반복되어가며 채워진다.