https://www.acmicpc.net/problem/10809

문제를 처음 봤을 때, '해당 알파벳을 찾으면 그 알파벳의 인덱스를 리턴해주면 될 것 같다.'라는 생각을 하였다. 그렇다면 더 쉽고 간편하게 문제를 풀 수 있을까???
find() 함수를 사용할 때 주의할 점은, 존재하지않는 문자를 찾을 경우, -1이 아닌 양수가 출력된다.
int main(){ string s; getline(cin, s); cout << s.find('a') << '\n'; cout << s.find('b') << '\n'; cout << s.find('c') << '\n'; cout << s.find('d') << '\n'; return 0; }예를들어 위 코드에 'abc'를 입력했을 경우, 'd'가 없기 때문에 '4294~~~' 와 같은 큰 양수가 출력된다.
이 경우는 string::npos가 반환되기 때문인데, npos의 값은 -1로 정의되어있지만 string::npos의 자료형이 unsigned이므로 2의 보수 개념에 의해 표현할 수 있는 최대 크기의 양수가 출력되는 것이다.
이를 방지하기 위해서는 unsigned가 아닌 일반 int형으로 캐스팅을 진행하여 출력하면 된다.
int main(){ string s; getline(cin, s); cout << s.find('a') << '\n'; cout << s.find('b') << '\n'; cout << s.find('c') << '\n'; cout << (int)s.find('d') << '\n'; return 0; }
제대로 -1이 출력 되는 것을 확인할 수 있다.
#include <iostream>
#include <string>
using namespace std;
int main(){
string alpha = "abcdefghijklmnopqrstuvwxyz";
string s;
getline(cin, s);
for(int i =0 ; i < alpha.length(); i++){
cout << (int)s.find(alpha[i]) << " ";
}
return 0;
}
솔루션은 간단한데, 천천히 풀어쓰자면
- alpha라는 모든 소문자 알파벳이 담겨있는 변수를 하나 선언한다.
- 받아온 s 문자열 안에서 알파벳 a~z가 어느 인덱스에 있는지 출력한다.
참고로, 아래처럼 반복문 자체를 알파벳으로 사용한 경우도 존재한다. 조금 더 상위레벨의 코딩? c++을 잘 아는? 코딩같아서 들고왔다.
#include <iostream> #include <string> using namespace std; int main() { string s; cin >> s; for (char i = 'a'; i <= 'z'; i++) { cout << (int)s.find(i) << ' '; } return 0; }
문제를 푼 후, 다른 사람들의 솔루션을 확인해보는 것도 좋은 학습방법인 것 같다.