

풀다보니 매우 좋은 풀이가 있어서 가져와봤다.
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int arr[26];
fill(arr+0, arr+26, -1);
string s;
cin >> s;
for(int i=0; i<s.size(); i++) {
if(arr[s[i]-'a']==-1) arr[s[i]-'a']=i;
}
for(int a : arr) cout << a << " ";
return 0;
}
나는 이렇게 풀었다.
fill() 로 배열을 -1로 초기화하고, 문자열을 순회하며 값이 -1인 인덱스의 요소를 문자열에서 등장 위치로 설정했다.
(아스키코드를 활용해 char를 int로 변환했다)
지금 보면 굳이 안써도되는 배열과 fill()을 써서 비효율적인 코드인듯하다.
#include <iostream>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string s;
cin >> s;
for(char i = 'a'; i<= 'z'; i++) cout << (int)s.find(i) << " ";
return 0;
}
코드가 정말 단순, 깔끔하다.
불필요하게 배열을 사용하지 않는다.
string으로 입력을 받고, for문의 루프 변수를 char로 써써 s.find()에 'a' 부터 'z' 까지 순서대로 넣어가며 특정 문자의 문자열상에서 위치를 찾는다.
문제 출력 조건 중
(1) a~z까지 순서대로 출력해야 한다는 것은 'for문의 루프 변수를 char로 써써 s.find()에 'a' 부터 'z' 까지 순서대로 넣기' 로 만족하고,
(2) 처음 등장하는 위치를 출력해야함은 앞에서 부터 탐색을 시작하는 s.find()로 만족시키고,
(3) 등장하지 않은 문자는 -1을 출력해야한다는 조건은 (int)s.find(s1) 으로 만족시킨다.
매우 효율적인 풀이인듯하다.
특히 for문 루프 변수로 보통 int를 쓰는데 char를 사용해서 쉽게 알파벳을 순서대로 함수에 인자로 전달하는것이
매우 인상적이었다.
다른 사람의 더 좋은, 더 깔끔한 풀이를보고 다양한 풀이 방법을 접하는 것이 좋은 것 같다.