본문 바로가기
코딩과 알고리즘

백준 알고리즘. 10809번. 알파벳 찾기

반응형

문제

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

입력

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

출력

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

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

예제입력

baekjoon

예제출력

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

해설

문제가 좀 혼동될수도 있으나,

간단히 말해, 26개의 숫자를 출력하되,

첫번째 숫자는 제시된 단어에서 알파벳 a 가 처음 나온 위치,

두번째 숫자는 제시된 단어에서 알파벳 b 가 처음 나온 위치,

이런식으로 해서 26개의 알파벳의 시작 위치를 a ~ z 까지 표시하는 것입니다.

그리고 해당 알파벳이 등장하지 않았다면 -1을 출력해야 하구요.

비교적 수월한 문제입니다.

그렇다면 아래와 같은 하나의 해법을 설명드릴 수 있는데요.

1. 26개의 a~z 까지 알파벳이 나온 위치를 보관한 배열을 확보합니다.

2. 26개의 방을 모두 -1로 채웁니다.

3. 단어의 첫글자부터 끝글자까지 한글자씩 조사합니다.

4. 한글자에 해당하는 알파벳의 보관할 방에 -1이 들어있는 경우 문자의 순번을 보관하고(0부터시작)

-1이 아닌 경우 아무것도 하지 않습니다.

5. 글자 조사가 끝난 다음 26개의 방에 들어있는 숫자를 차례대로 출력합니다.

소스가 단순하기 때문에 굳이 새부 설명은 제외하도록 하겠습니다 :)

 

#include <iostream>
using namespace std;

void Result()
{
	int alpha[26];
	char s[101];

	scanf("%s", &s );
	for(int i=0;i<26;++i)alpha[i]=-1;
	for(int i=0;i<strlen(s);++i) if(alpha[s[i]-'a']==-1)alpha[s[i]-'a']=i;
	for(int i=0;i<26;++i)printf("%d ", alpha[i]);
}

int main()
{
	Result();
	return 0;
}

이제 슬슬 등수가 더디 올라가네요 ㅎ..

 

반응형