반응형
아래 문제를 보면서 이 알고리즘을 알게되었고, 알아두면 좋은 알고리즘인 것 같아 포스팅을 하려한다.
[2941번] 크로아티아 알파벳 :: http://www.crocus.co.kr/803
사실 위의 문제는 어떻게든 풀 수 있다.(여러가지 방법으로 풀 수 있다는 의미이다.)
하지만 String STL의 다양한 함수를 이용하여 이 문제를 해결하면 좀더 고급스러운 코드를 만들 수 있는 것 같다.
위의 문제의 코드를 기반으로 알고리즘을 알아보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #include <iostream> #include <cstdio> #include <string> using namespace std; string str; int main() { cin >> str; int pos = 0; string croatia[8] = { "c=","c-","dz=","d-","lj","nj","s=","z=" }; string tmp; string star = "*"; for (int i = 0; i < 8; i++) { tmp = croatia[i]; if (str.find(tmp) != string::npos) { while ((pos = str.find(tmp)) != string::npos) { str.erase(pos, tmp.length()); str.insert(pos, star); } } } cout << str.size() << endl; return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
이 코드에서 가장 중점적으로 볼 부분은 당연히 for문속의 if부분과 while부분이다.
1 2 3 4 5 6 7 8 | if (str.find(tmp) != string::npos) { while ((pos = str.find(tmp)) != string::npos) { str.erase(pos, tmp.length()); str.insert(pos, star); } } |
이 부분은 매우 재미있는 부분이다.
npos
string::find는 찾는 문자열의 첫번째 인덱스를 반환한다. 이때 찾는 문자열이 없을 경우 string::npos를 반환한다.
즉, 예외처리를 위해 nullptr처럼 string에도 find를 이용하면 npos를 이용해야 한다.
이렇게 이제 if문에 대한 해석은 :: tmp의 값을 찾아봐라. 있다면 if문속으로 없다면 npos를 반환(npos 반환값이 -1이라고 알고 있다.)
이제 아래의 while문을 보면 위의 if문과 같은데, 이제 tmp값이 있다면 그 값의 위치를 pos에 담게 된다.
아래의 erase를 통해 그 단어를 찾아 지울 수도 있고,
그 지운 부분에 다른 단어(찾아 바꾸기 기능)을 넣고 싶다면 insert를 통해 원하는 값을 넣을 수 있다.
알고리즘이 간단하지만, Java에만 존재하는 replaceAll같은 메소드를 대체 할 수 있는 좋은 알고리즘이다.
반응형
'Applied > 알고리즘' 카테고리의 다른 글
구간 합(Prefix Sum) 알고리즘 (2) | 2017.05.01 |
---|---|
최적화된 에라토스테네스의 체(Eratosthenes' sieve) (0) | 2017.04.21 |
LCS(Longest Common Subsequence) 알고리즘 (11) | 2017.04.19 |
최소 버텍스 커버(Minimum Vertex Cover) (0) | 2017.04.12 |
최소 컷(Minimum Cut) (2) | 2017.04.12 |