[BOJ] 10809_알파벳 찾기

gogori6565·2022년 7월 21일
0

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


풀이

  1. 알파벳 26개를 담은 배열을 -1로 전부 초기화한다.
  2. 입력받은 단어의 한 글자씩 알파벳을 비교해 일치할 경우 해당 알파벳을 가리키는 배열 요소에 단어 속 등장위치를 대입한다.
  • 알파벳 26개를 일일이 비교하므로, 알파벳의 아스키코드를 활용한다.

    • 단어의 각 한 글자 역시 아스키코드로 나타낼 수 있다.
    • a의 아스키코드는 97이므로 97부터 1씩 늘려가며(++) 총 26개의 알파벳을 (아스키코드로 변환한)단어의 각 글자와 비교한다.
  • 일치하는 알파벳이 나올 경우 해당 알파벳을 가리키는 배열 요소에 등장위치를 대입한다.

  • 주의! 단어 내 알파벳이 중복될 경우, 등장한 가장 처음 위치를 출력하도록 한다.

    • 알파벳 배열의 요소값이 -1일 경우(처음 등장) 등장위치를 대입하도록 조건을 걸어주면 된다.
  1. 입력받은 단어의 글자 수 만큼 반복하며, 비교대상인 알파벳 아스키코드 변수(alp)를 매 반복 마다 초기화(97로) 해주어야한다.

풀이 코드

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

int main(void)
{
    cin.tie(NULL); ios_base::sync_with_stdio(false);

    string str;
    cin>>str;

    int arr[26]; //알파벳 26개 배열
    fill_n(arr,26,-1);

    //소문자 a 아스키코드 97
    int alp=97;
    for(int i=0;i<str.size();i++)
    {
        for(int j=0;j<26;j++)
        {
            if((int)str[i]==alp)
                if(arr[j]==-1)
                    arr[j]=i;
            
            alp++;
        }
        alp=97;
    }

    for(int i=0;i<26;i++)
        cout<<arr[i]<<" ";

    return 0;
}

📌 유의한 점!

  1. 단어 내 알파벳이 중복될 경우, 처음위치를 출력하도록 한다.
    => 알파벳 배열의 요소값이 -1일 경우(처음 등장) 등장위치를 대입하도록 조건을 걸어주면 된다.

  2. alp 변수를 97로 초기화해야한다. 다시 a부터 검사할 거니까!


💡 새롭게 알게 된 것!
std::fill_n() 함수 : 배열의 모든 요소를 특정 값으로 반복없이 한 번에 초기화시켜준다.

(자세한 방법은 다음 글에 포스팅 하겠다.)


문제 출처 : https://www.acmicpc.net/problem/10809

profile
p(´∇`)q

0개의 댓글