새벽을 밝히는 붉은 달

[C] Baekjoon #10809 알파벳 찾기 : 배열 초기화에 대해 공부 본문

Online Judge

[C] Baekjoon #10809 알파벳 찾기 : 배열 초기화에 대해 공부

자윰 2020. 1. 17. 01:12

교수님께서 하루에 한 문제씩은 꼭 풀라고 하셔서 열심히 도전 중이다.

오늘 푼 문제는 백준에 있는 10809번 - 알파벳 찾기 이다.

먼저 문제를 보자.

 


문제

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

입력

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

출력

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

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


이런 문제이다.

처음에 보고, stroke 함수를 이용해서 배열을 잘라 문자가 입력된 배열만 쓰려고 했으나,

논리 연산자를 이용하면 굳이 그럴 필요가 없겠다 싶어서 그냥 자르지 않기로 했다.

 

그래서 내가 생각해낸 방향은

  1. 배열 입력받기

  2. location[26] 배열을 선언하여 -1로 초기화

  3. for로 루프돌며 알파벳 등장 위치를 location에 저장

  4. location 출력

 

이렇게 짰는데, 에... 왜 0이 자꾸 나오는거지?????

그리고 조금 고민을 한 결과, 답이 나왔다.

 

내가 배열 초기화에 대해 잘못 알고 있었던 것이었다.

    int location[26] = { -1};

로 초기화를 했는데,

사실 이건 location[0]만 -1로 초기화되는 것이었고,

나머지 배열은 0으로 초기화되는 것이었다.

 

배열 전체를 초기화하려면 다음과 같은 방법을 써야 한다.

  1. for을 이용하여 원하는 수로 초기화

  2. <string.h>/<memory.h>에 있는 memset함수를 이용하여 초기화

 

1번 방법은 어떻게 써야할지 알 것 같아서, 처음 접해본 2번 방법을 써보기로 하였다.

memset함수는 메모리의 내용을 원하는 크기만큼 특정한 값으로 설정할 수 있는 함수라고 한다.

(출처: https://dojang.io/mod/page/view.php?id=287)

 

사용 방법은 다음과 같다.

memset(포인터, 설정할 값, 크기(바이트 단위) );

 

이때, 바이트 단위가 상당히 중요하다. 

만약, 포인터는 1바이트인데 크기를 포인터의 크기로 했다면

(ex.

        char *ptr = (char *)malloc(sizeof(char));

        memset(ptr, -1, sizeof(char *));

)

64비트인 경우 8바이트 단위로 설정되기 때문에 메모리 크기를 넘어서기 때문이다.

 

이 방법을 사용하여 내가 짠 코드는 다음과 같다.

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

int main(void) {
	char alpha[100];
	scanf("%s", alpha);

	int location[26]; 
	memset(location, -1, sizeof(location)); //location을 셀 배열을 -1로 초기화

	for (int i = 0; i < 26; i++) {
		for (int j = 0; alpha[j] != NULL; j++) {
			char a = (char)i + 'a';
			if (alpha[j] == a) {
				location[i] = j;
				break;
			}
		}
	}
	for (int k = 0; k < 26; k++)
	{
		printf("%d ", location[k]);
	}
	return 0;
}

 

문제가 그리 어려운 문제는 아니었으나, 새로운 함수에 대해 공부할 수 있어 유의미한 문제였던 것 같다.

Comments