https://www.acmicpc.net/problem/10809
가장 일반적인 경우를 디폴트로 생각하자.
단어에 포함된 알파벳들의 인덱스를 기억해서 그 위치를 출력하고, 나머지는 -1을 출력한다고 생각하지 말고!!
일단 모든 알파벳을 -1로 설정해두고, 단어에 포함되는 문자일 경우에만 -1을 다른 인덱스 값으로 바꾼다고 생각하자!
// 10809번. 알파벳 찾기
#include <iostream>
#include <string>
using namespace std;
struct Alphabet {
char ch;
int idx;
};
int main() {
Alphabet alpha[26];
for (int i = 0; i < 26; i++){
alpha[i].ch = 'a' + i;
alpha[i].idx = -1;
}
string str;
cin >> str;
for (unsigned int i = 0; i < str.length(); i++) {
for (int j = 0; j < 26; j++) {
// str[i]는 고정된 상태에서, alpha[j].ch는 a~z까지 변화
// 해당하는 알파벳을 발견하면 그 알파벳의 -1을 str[i]의 i로 변경하기
if (str[i] == alpha[j].ch) {
// 단, -1이 아닌 경우는 이미 등장했던 문자이므로
// 인덱스 업데이트 없이 넘어가기
if (alpha[j].idx == -1) {
alpha[j].idx = i;
}
}
}
}
for (int i = 0; i < 26; i++) {
cout << alpha[i].idx << " ";
}
return 0;
}
https://cryptosalamander.tistory.com/11
find 함수 설명: https://velog.io/@jxlhe46/백준-1436번.-영화감독-숌
find함수는 검색하려는 문자열의 첫번째 문자의 위치를 리턴한다. 문자열을 발견하지 못 하면, std::string::npos를 리턴한다.
static const size_t npos = -1;
npos는 size_t 타입의 최댓값을 갖는 상수이다. size_t는 부호 없는 정수 타입이므로 -1은 이 타입에서 가장 큰 값을 나타낸다. 이 값이 len함수의 인자로 사용되면 그것은 "문자열의 끝까지"를 의미한다. 반면에, 리턴값으로 사용되면 "일치하는 값이 없음"을 의미한다.
#include <iostream>
#include <string>
using namespace std;
int main() {
string a = "abc";
cout << a.find('a') << '\n';
cout << a.find('b') << '\n';
cout << a.find('c') << '\n';
cout << (int)a.find('d') << '\n';
return 0;
}
/*
find의 기본 리턴형은 size_t (unsigned int)
0
1
2
4294967295 // unsigned int형에서 -1은 최댓값을 나타냄.
(signed) int형으로 형변환하면?
0
1
2
-1
*/
언더플로우와 오버플로우: https://dojang.io/mod/page/view.php?id=32
// 10809번. 알파벳 찾기
#include <iostream>
#include <string>
using namespace std;
int main() {
string alphabet = "abcdefghijklmnopqrstuvwxyz";
string str;
cin >> str;
for (int i = 0; i < alphabet.length(); i++) {
// str에서 i번째 알파벳을 발견하면, 발견한 그 위치를 출력하기
// 한 단어에 같은 문자가 여러 번 나오더라도
// find 함수는 앞에서부터 탐색을 하니까 문자를 처음 발견한 위치를 출력한다.
cout << (int)str.find(alphabet[i]) << " ";
}
return 0;
}