[백준 10809] 알파벳 찾기

백준 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를 응용하여 풀었다.

  1. 문자열을 입력받는다.
  2. a~z까지 알파벳이 담긴 vector를 만든다.
  3. 이 문자열의 index를 순회하며 2에서 만든 vector에서 알파벳이 몇 번째에 등장하는지 find 함수로 찾는다.
    • find(vec.begin(), vec.end()) - vec.begin() 으로 index 번호를 알아낼 수 있다.
  4. 알아낸 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