본문 바로가기

프로그래밍/백준

[C언어] 10809. 알파벳 찾기

 

 

나의 풀이

#include <stdio.h>
#include <string.h>

int main(void) {
    int c, index = 0, arr[26];		//arr : 정답을 저장해 줄 배열
    memset(arr, -1, sizeof(arr));   //배열 -1로 초기화

    while ((c = getchar()) != '\n') {	//개행 전까지 단어 한 글자씩 비교
        if (arr[c - 97] == -1) {	    //해당 알파벳이면 인덱스값을 배열에 넣기
            arr[c - 97] = index;
        }
        index++;
    }
    for (int i = 0; i < 26; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

 

memset()은 string.h에 들어있는 함수다.

메모리를 초기화할 때 편하다. 

단순히 0으로 초기화할 때는 arr[26]={0}으로 해주어도 되지만, 

-1 또는 1로 초기화하고 싶을 때 아래와 같이 활용한다.

int arr1[26];
memset(arr,-1,sizeof(arr)); //memset(초기화할 주소,초기값,크기)

char arr2[26];
memset(arr,1,sizeof(arr));

 

getchar()는 글자를 하나씩 가져오는 함수이다. 

scanf()로 단어 자체를 가져와서 비교하는 방법도 있었을 테지만... 

요새 getchar()를 쓸 일이 많아서 그냥 이걸로 썼다. 

특정 글자(\0, \n 등)가 나왔을 때까지 계속 스캔하는 용도로 쓰면 매우 편하다. 

 

참고로 scanf에서도 가능한 기능이긴 하다.

줄바꿈 전까지 무조건 입력하고 싶을 때는 scanf("%[^\n]s, s) 요런 식으로,

^ 전에 줄바꿈문자를 넣으면 된다. 줄바꿈문자 말고 다른 문자도 가능하니 참고해두면 좋다! 

 

arr[c-97]은...맨 처음에 배열 선언할 때 알파벳 기준으로 선언했기 때문에 나온 코드이다.  

int arr[26]은 A~Z까지 입력여부 및 인덱스를 저장할 배열이다. 

 

getchar로 가져온 char에서 소문자 a의 아스키 코드인 97을 빼주면

arr[0]~arr[26]까지 예쁘게 입력 가능하다.

예를 들면 c=getchar()로 b를 가져왔을 때, b(아스키코드 98)-97=1이기 때문에

arr[1]에 b의 인덱스를 저장할 수 있는 것이다!

 

간편한 점은 맨 처음에 memset을 이용해 배열을 -1로 초기화해주었기 때문에 

맨 마지막에서 배열 출력 시 if문 등으로 값이 있는지 없는지 계산할 필요 없이 

바로 출력하면 된다는 것이다. 

 

생각해 보니 이렇게 하면 무조건 26*4byte에 대해 메모리를 잡아먹으므로... 

테스트케이스에 따라 다르겠지만 다른 분들처럼 문자열을 배열로 가져와서 비교하는 것이 더 효율적일지는

고민해볼 문제이다.

'프로그래밍 > 백준' 카테고리의 다른 글

[백준 C언어] 3052. 나머지  (0) 2022.12.21
[백준 C언어] 2908. 상수  (2) 2022.12.21
[백준] 1292. 쉽게 푸는 문제  (0) 2022.11.15
[백준] 1978. 소수 찾기  (0) 2022.11.15
[백준] 2693. N번째 큰 수  (0) 2022.11.15