Moong

[백준 10809번][C++] 백준 알파벳 찾기 본문

Baekjoon

[백준 10809번][C++] 백준 알파벳 찾기

방울토망토 2021. 1. 6. 05:10

www.acmicpc.net/problem/10809

 

10809번: 알파벳 찾기

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다. 만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출

www.acmicpc.net

문제

알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.

출력

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.

만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.


풀이

algorithm

  1. 문자열을 입력받아옵니다
    • cin >> S;
  2. 알파벳이 단어에 포함되어있는지 알려주는 리스트를 만들고, 초기화해줘요
    • int alphabet[26]; (index 0번부터 순서대로 각각 a, b, c, d, ...를 의미하는 자리가 되겠죠?)
    • 문제에서 알파벳이 포함되어있지 않을 땐 -1이라고 했으니, 처음에는 모두 -1로 초기화 해주어야 해요
    • -1로 초기화 하려면 기존의 방식인 int alphabet[26] = {-1,}으로 초기화해줄 수 없어요
    • fiil_n(배열이름, 배열길이, 초기화 값);으로 초기화 해주어야 해요! (fill_n(alphabet, 26, -1);)
  3.  이제 문자열(S)의 문자를 하나씩 읽어와서 alphabet 배열의 값을 바꿔요
    • 여기에서! 아스키 코드를 이용해요! 
    • 배열 alphabet에서 'a'가 0번째 자리이니까, 'b'는 1번째 자리, 'c'는 2번째 자리, ... 가 된다는 것에 주목해요
    • 그럼 내가 S에서 한개 읽어온 문자가 alphabet에서 몇 번째 자리인지 알아내면, 그 자리에 S에서의 index값을 넣어주면 되겠죠?
    • 문자의 index값을 알아내는 방법은 문자의 ASCII code에서 'a'의 ASCII code값을 빼주면 돼요
    • 배열 alphabet에서 'a'가 0번째 자리니까, 'b'는 1번째 자리, 'c'는 2번째 자리, ...가 된다는 것에 주목해요
    • ex) S가 "abc"일 때, S[0]인 'a'는 alphabet에서 0번째 자리이다 -> alphabet[0]에 a의 S에서의 index값 0을 넣어주면 되겠다! alphabet[0] = 0; 
  4.  근데 문자열(S)의 문자를 앞에서부터 읽어오면 처음 등장하는 위치를 출력 한다는 조건을 만족하지 못해요
    • 이 조건을 만족시키기 위해선 그렇다면 뒤에서부터 읽어오면 되겠죠?
    • 예를 들어 뒤에서 읽어오면 'abcda'의 경우 alphabet[0] = 4였다가 alphabet[0] = 0으로 바뀌게 될거예요
  5.  마지막으로 alphabet의 값들을 모두 출력해주면 완성!

 

code

#include <iostream>
#include <string>
using namespace std;

int main() {
	string S;
	int alphabet[26];
	fill_n(alphabet, 26, -1); //alphabet 배열을 -1로 초기화 해주기
	cin >> S;
	
    // 뒤에서부터 읽어와서 해당 알파벳 자리에 index 값을 넣어줘요
    // 뒤에서부터 읽는 이유는 처음 등장하는 위치를 저장하기 위해서! (덮어쓸 수 있으니까요)
	for (int i = S.length() - 1; i >= 0; i--)
		alphabet[S[i] - 'a'] = i; // 'a'가 0번째가 되어야 하니까 'a'를 빼줘요
	
	for (int n = 0; n < 26; n++)
		cout << alphabet[n] << ' ';
	cout << '\n';

	return 0;
}

 

Comments