coding_test/BAEKJOON

백준 10809번 C언어 풀이

CodeJin 2021. 8. 7. 21:55

https://www.acmicpc.net/problem/10809

 

10809번: 알파벳 찾기

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

www.acmicpc.net

입력받은 알파벳의 배열에서 각 알파벳이 처음으로 등장하는 위치를 출력하는 문제.

 

이전에 푼 실버티어의 15596번이나 4673번이랑 동급, 혹은 그 이상으로 어려웠다.

 

각설하고, 맨 처음에는 배열에 한 글자씩 접근해서 26개의 조건문을 쓰려고 했다가, 그런 의도로 낸 문제는 아닌 것 같아 다른 방법을 생각해보았다.

 

답은 같은 단계별 문제 풀이에서 아스키코드 문제와 (https://www.acmicpc.net/problem/11654) 이를 이용하여 풀었던 문제(https://www.acmicpc.net/problem/11720, https://codejin.tistory.com/4)에서 영감을 받았다. 

 

알파벳의 아스키코드역시 a부터 1씩 증가하는 형태이므로, 알파벳으로 된 단일문자에서 'a'의 아스키코드만큼 뺀 값을 정수형 변수에 넣으면 a부터 z까지 각각 0~25에 매칭할 수 있다. 이를 이용하여 풀이하였다.

 

#include <stdio.h>

int main(){
    char S[100]; // 입력받을 문자열
    int ascii; // 알파벳을 아스키코드를 이용한 숫자로 저장할 변수
    int alpha[26] = {0,}; // 알파벳 위치에 대응하는 배열
    int idx = 0; // 반복 인자
    int first; // 맨 첫글자를 저장할 변수

    scanf("%s", S);

    while (S[idx] != '\0'){
        ascii = S[idx] - 'a'; // 알파벳을 숫자로 변환한다   
        first = idx == 0 ? ascii : first; // 맨 처음에 위치하는 알파벳

        alpha[ascii] = alpha[ascii] == 0 ? idx : alpha[ascii]; // 알파벳 위치에 대응하는 요소에 맨 처음 위치 저장
        if (ascii == first) { // 맨 처음 등장하는 단어가 그 다음 위치의 숫자로 바뀔 수 있으므로 0으로 수정하여 이를 방지한다
            alpha[ascii] = 0;
        }
        idx++;
    }

    for (int i=0; i<26; i++) {
        if (alpha[i] == 0 && i != first) { // 요소의 값이 0이면서, 동시에 첫글자가 아닌 경우
            printf("-1 ");
        } else {
            printf("%d ", alpha[i]);
        }
    }
}