[백준 10809] 알파벳 찾기
백준 10809번 - 알파벳 찾기
❓ 문제
알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.
✏️ 풀이
단어가 주어진다.
각각의 알파벳에 대해 a가 처음 등장하는 위치, b가 처음 등장하는 위치… z가 처음 등장하는 위치에 대해 출력
포함되지 않는 알파벳은 -1으로 출력
input
baekjoon
output
1 0 -1 -1 2 -1 -1 -1 -1 4 3 -1 -1 7 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
느낌이 오는가?
이 문제는 각 단어가 처음 등장하는 것을 체크해주는 check vector
와 답안을 vector<int> answer
그리고 algorithm 라이브러리의 find를 응용하여 풀었다.
- 문자열을 입력받는다.
- a~z까지 알파벳이 담긴 vector
를 만든다. - 이 문자열의 index를 순회하며 2에서 만든 vector에서 알파벳이 몇 번째에 등장하는지 find 함수로 찾는다.
find(vec.begin(), vec.end()) - vec.begin()
으로 index 번호를 알아낼 수 있다.
- 알아낸 index가 처음인지 아닌지 판단하고, answer vector에 index 번호를 기입한다.
find를 이용하지 않아도 풀 수 있었겠지만 이 방법이 제일 먼저 떠올라 사용하였다.
✔️ 정답 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> answer(26,-1);
vector<bool> check(26,false);
vector<char> vec;
int main(void) {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
string S;
cin >> S;
for (int i=0; i<26; i++) {
vec.push_back('a'+i);
}
for (int i=0; i<S.length(); i++) {
if (!check[find(vec.begin(), vec.end(), S[i]) - vec.begin()]) {
check[find(vec.begin(), vec.end(), S[i]) - vec.begin()] = true;
answer[find(vec.begin(), vec.end(), S[i]) - vec.begin()] = i;
}
}
for (int i=0; i<26; i++) {
cout << answer[i];
if (i!=25)
cout << " ";
}
return 0;
}
Leave a comment