● 문제 접근 과정
1. dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.
2. 일단 입력을 받고, str.length()만큼 반복문을 돌려야겠다고 생각.
3. 안에서 해당하는 단어가 나오면 cnt 변수를 올려주고 인덱스도 변경시키며 continue를 실행
4. cnt를 마지막으로 출력
============================================================================================
이렇게 풀었지만, 결과적으로 코드가 너무 조잡하다는 느낌을 받게 됨.(좀 더 간략하게 하거나, 함수를 따로 만들고 싶었음.) 그래서, https://carrot-farmer.tistory.com/29 이분의 코드를 가져와 혼자 해석해 보았음.
1. `main` 함수:
- `ios_base::sync_with_stdio(false);`와 `cin.tie(NULL);`은 C++의 입출력 버퍼를 풀어주는 역할을 합니다. 이는 입출력 성능을 향상시키기 위한 최적화입니다.
- 문자열 `s`를 입력 받습니다.
- `count` 함수를 호출하여 변환된 문자열의 길이를 계산하고 출력합니다.
2. `count` 함수:
- `alphabet` 배열에 저장된 크로아티아 알파벳에 대해서 반복문을 돌면서 해당 패턴이 문자열 `str`에 존재하는지 확인합니다.
- `find` 함수는 문자열에서 특정 패턴을 찾아 해당 위치를 반환하며, 찾지 못할 경우 `-1`을 반환합니다.
- 만약 패턴이 존재한다면, 해당 위치부터 패턴의 길이만큼을 `#`으로 대체합니다. 이 작업을 해당 패턴이 더 이상 존재하지 않을 때까지 반복합니다.
- 모든 크로아티아 알파벳에 대한 처리가 완료된 후, 최종적으로 변환된 문자열의 길이를 반환합니다.
이 코드는 크로아티아 알파벳에 대한 처리를 효과적으로 수행하여 입력된 문자열에서 해당 패턴들을 찾아 `#`으로 대체하고, 최종적으로 변환된 문자열의 길이를 출력합니다.
// replace 함수 설명
string& replace (size_t pos, size_t len, const string& str);
- `pos`: 대체가 시작될 위치를 나타내는 인덱스입니다.
- `len`: 대체할 부분 문자열의 길이입니다.
- `str`: 대체될 새로운 문자열입니다.
예제:
#include <iostream>
#include <string>
int main() {
std::string s = "Hello, world!";
// 문자열의 인덱스 7부터 5개의 문자를 "there"로 대체
s.replace(7, 5, "there");
std::cout << s << std::endl; // 출력: Hello, there!
return 0;
}
이 예제에서는 문자열 "Hello, world!"에서 인덱스 7부터 시작하는 5개의 문자를 "there"로 대체합니다. 결과적으로 문자열은 "Hello, there!"로 변합니다.
`replace` 함수를 사용하면 특정 위치에서 시작하여 지정된 길이만큼의 부분 문자열을 새로운 문자열로 간단히 대체할 수 있습니다.
● 구현
#include <iostream>
#include <string>
using namespace std;
int main() {
int cnt = 0;
string str;
getline(cin, str);
for (int i = 0; i < str.length(); i++) {
if (str[i] == 'c' && str[i + 1] == '=') {
cnt++;
i++;
continue;
} else if (str[i] == 'c' && str[i + 1] == '-') {
cnt++;
i++;
continue;
} else if (str[i] == 'd' && str[i + 1] == 'z' && str[i + 2] == '=') {
cnt++;
i += 2;
continue;
} else if (str[i] == 'd' && str[i + 1] == '-') {
cnt++;
i++;
continue;
} else if (str[i] == 'l' && str[i + 1] == 'j') {
cnt++;
i++;
continue;
} else if (str[i] == 'n' && str[i + 1] == 'j') {
cnt++;
i++;
continue;
} else if (str[i] == 's' && str[i + 1] == '=') {
cnt++;
i++;
continue;
} else if (str[i] == 'z' && str[i + 1] == '=') {
cnt++;
i++;
continue;
} else {
cnt++;
}
}
cout << cnt;
return 0;
}
#include <iostream>
#include <string>
using namespace std;
int count(string str);
int main() {
ios_base::sync_with_stdio(false); // 두 표준 입출력 동기화 해제
cin.tie(NULL); // 입력과 출력 묶음을 풀기
string s;
cin >> s;
cout << count(s);
return 0;
}
int count(string str){
string alphabet[8] = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};
for(int i = 0; i < 8; i++){
while(1){
if(str.find(alphabet[i]) != -1){
str.replace(str.find(alphabet[i]), alphabet[i].length(), "#");
}else break;
}
}
return str.length();
}
https://www.acmicpc.net/problem/2941