티스토리 뷰

알파벳 찾기

문제

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

입력

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

출력

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

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

예제 입력 1

baekjoon

예제 출력 1

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

출처 문제를 만든 사람: baekjoon

해설

최대 100개의 소문자로 이루어진 문자열을 입력받아서 알파벳 az까지 차례대로 최초 출현 위치를 출력하는 문제다. (제발 문제를 이해하기 편하게 적어 주었으면 좋겠다.) 문자열을 입력받을 변수 input[100]을 선언하고 알파벳 az까지 각각의 최초 출현 위치를 저장한 변수 result[26]을 선언한다. result[0]이 a에, result[1]이 b에 … result[24]가 y에, result[25]가 z에 대응되는 것이다. 다만 문제에서 해당 알파벳이 출현하지 않을 때의 값이 -1로 지정되어 있으므로 result[26]-1로 초기화하였다.

    char result[26] = {[0 ... 25] = -1};

여기서 아스키코드표를 다시 들여다보자.
ascii table

소문자 a의 아스키코드는 97이다. 각 문자의 아스키코드값에서 97을 빼면 앞서 선언한 배열 result에서 각 알파벳에 대응하는 원소가 된다. 예제 입력인 baekjoon를 생각해보자. b의 아스키코드는 98이므로 여기에서 97을 빼면 1이다. 이 1은 배열 result에서 b에 대응하는 resutl[1]의 첨자인 1과 동일하다. 이와 동일하게 a의 아스키코드 97에서 97을 빼연 0이고 이는 배열 result에서 a에 대응하는 result[0]의 배열 첨자인 0과 동일하다.

이에 착안하여 input의 각 원소의 아스키코드에서 97을 뺀 값을 pos에 대입한다. 이 pos를 result의 배열 첨자로 삼고(resutl[pos]) inout배열의 첨자, 즉 문자열에서 해당 문자의 위치인 i를 result[pos]에 대입한다.

        pos = input[i] - 97;
        result[pos] = i;

이때 하나의 알파벳이 중복하여 나오는 경우 최초 출현 위치만을 저장해야 한다. 따라서 if문으로 result의 해당 원소의 값이 변경된 적이 있는지를 확인하여 변경된 적이 없는 경우에만 result[pos]의 값을 변경하도록 한다.

    for (i = 0; i < strlen(input); ++i) {
        pos = input[i] - 97;
        if (result[pos] == -1) {
            result[pos] = i;
        }
    }

마자막으로 배열 result의 각 원소의 값을 출력한다.

소스코드: C

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
    char input[100];
    char result[26] = {[0 ... 25] = -1};
    int i, pos; 


    scanf("%s", input);
    for (i = 0; i < strlen(input); ++i) {
        pos = input[i] - 97;
        if (result[pos] == -1) {
            result[pos] = i;
        }
    }

    for (i = 0; i < 26; ++i) {
        printf("%d ", result[i]);
    }

    return 0;
}

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함
11-25 22:18