본문 바로가기

문제풀이

[C언어] 백준 10809 알파벳찾기

#include <stdio.h>

int main(void)
{
    int i;
    char word[100+1];
    char alpha[26] = {'\0'};

    scanf("%s", word);      
    
    alpha[word[0] - 'a'] = -2; 

    for (i = 1; word[i] != '\0'; i++) 
    {
        if (!alpha[word[i] - 'a']) 
            alpha[word[i] - 'a'] = i;
    }

    for (i = 0; i < 26; i++)
        printf("%d ", alpha[i] == 0 ? -1 : alpha[i] == -2 ? 0 : alpha[i]);

    return 0;
}

 

  • 풀이방식1
    • 첫 번째 occurrence 를 찾은 후 그 인덱스를 alpha에 저장하는 for loop
    • alpha를 돌면서 해당 알파벳이 word에 포함되어있는지 아닌지를 출력하는 for loop
 0. variables
    - word[100+1]: 인풋 c-string
    - alpha[26]: a-z까지의 char,  word안에서 first occurrence index 저장, 없다면 0으로 초기화
      index       value      meaning
      --------      --------     -------------
         0                 1           word[1] = 'a'
         1                 -2          word[0] = 'b'        //인덱스 0은 예외적으로 -2로 set함
         2                 0            'c'는 word에 존재하지 않음
         ...                ...
         26               2            word[2] = 'z'     
       ...-> word는 "baz..."
1. get the user input for c-string
    "word" 입력 (max 100)
2. 실제 인덱스 0과 occurence가 없어서 요소값이 0인 것을 구분하기 위해
      word의 인덱스 0에 존재하는 첫번째 char을 가리키는 alpha값을 임의의 값 -2로 set
     word[0] - ('a' -1) -1 => word[0] - 'a'3. for loop: "i"의 실제 char이 word에 처음으로 등장한다면, 인덱스를 저장
4. 출력
     alpha char array를 돌면서
     값이 0이라면 -1(존재하지 않음) 출력
     값이  -2이라면 0(인덱스0) 출력
      그 외 저장된 값을 출력      

 

  • strchr을 활용한 풀이방식2
#include <stdio.h>
#include <string.h>

int main(void)
{
    char i;
    char word[100+1], *p;

    gets(word);

    for (i = 'a'; i < 'z' + 1; i++)
    {
        p = strchr(word, i);
        printf("%d ", p==NULL ? -1 : p - word);
    }

    return 0;
}
  • 변수를 줄이고 코드를 단순화할 수 있을 것 같아 시도해보았다
    • 하나의 for-loop 안에서 특정 알파벳이 위치한 인덱스를 찾자마자 출력하는 로직
    • 불필요한 변수 alpha 삭제
    • scanf를 gets로 대체
    • strchr과 strchr의 리턴값을 저장할 포인터 변수 선언이 문제풀이의 핵심
  • strchr
    • #include <string.h>
    • char *strchr(const char *string, int c);
    • returns a pointer to the first occurrence of c that is converted to a character in string.
      The function returns NULL if the specified character is not found.
    • 두번째 인자로 주어진 char을 첫번째 인자 c-string에서 탐색하고, 처음으로 발견한 char의 address를 리턴한다
      • Ex. HelloNewYear에서 'e'가 처음으로 나오는 인덱스를 알고 싶을 때
        • pointer = strchr(string, 'e') -> e는 string의 인덱스 1에 처음으로 존재한다.
          리턴값은 첫번째 요소의 주소+1(찾은 인덱스)인 string+1이 된다
          • 배열의 이름은 늘 첫번째 요소의 주소를 리턴
          • 두번째 요소의 주소는 첫번째 요소의 주소 +1
        • 거꾸로 이를 이용하면 pointer - string은 string 안에서 'e'가 존재하는 인덱스와 같다.
    • 단 string에서 c를 찾지 못한다면 리턴값은 NULL이다

'문제풀이' 카테고리의 다른 글

[C언어] 백준 1152 단어의 개수  (0) 2021.12.22
[C언어] 백준 1157 단어공부  (0) 2021.12.22
[C언어] 백준 2675 문자열반복  (0) 2021.12.21
[C언어] 백준 11720  (0) 2021.12.21
[C언어] 백준 15596  (0) 2021.12.20