프로그래밍 언어/C

C언어 백준 10809

happy_life 2021. 9. 7. 21:43

10809번: 알파벳 찾기 (acmicpc.net)

 

10809번: 알파벳 찾기

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

www.acmicpc.net

 

문제

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

 

 

풀이

 

#include <stdio.h>
#include <string.h> //strlen 함수를 위한 것 

int main() {

	int arr[26];
	char S[100];
	scanf("%s", S);
	int i, j;

	for (int i = 0; i < 26; i++)
		arr[i] = -1;

	for (i = 97; i <= 122; i++)
	{

		for (j = 0; j < strlen(S); j++)
		{
			if (S[j] == i)
			{
				arr[S[j] -'a'] = j;
				break;
			}
		}
	}
		for (i = 0; i < 26; i++) {

			printf("%d ", arr[i]);
			
		}
	
	return 0;

}

 

코드 하나하나 뜯어보기 

 이번 문제는 이 밑에 있는 코드가 가장 핵심이라고 할 수있으니, 이것을 한번 체크해보자

	for (i = 97; i <= 122; i++)
	{

		for (j = 0; j < strlen(S); j++)
		{
			if (S[j] == i)
			{
				arr[S[j] -'a'] = j;
				break;
			}
		}
	}

 

1)왜 첫번째 for 문의 i는 97부터~122 인가?

 ASCII 코드에서 a = 97, 차례 대로 가고 z = 122 이다. 즉 저 for 문은 알파벳을 순서대로 확인해주기 위해 작성한 것이다.

 

2)두번쨰 for 문은 무엇을 의미하는가? 

예를들어 i = 97 (a일때 ) 를 기준으로 입력받은 문자열 배열을 첫번째 인수부터 순서대로 확인해주는 것이다.

3) arr[[S[j]-'a'] = j ; 는 무엇을 의미하는가?

여기서 S[j] 는 if(S[j] == i ) 문 안에 있다. 따라서 s[j] == i 이어야 한다.

예를 들어 입력값 'baekjoon' 에서 i =97 일 때, s[j] = 97 이므로 j = 1(두번째 자리에 a가 있음 )가 될 것이다. s[j]를 우리가 문자열 인덱스(int arr)와 연관지어 생각해보자. 이제 우리가 원하는 것은 arr[0] = 1이 되는 것이다. 

 따라서 s[1] -'a' = 0 이 되도록 하기 위해 'a'를 넣어준 것이다.

(s[1] = 97 이고 문자 'a' = 97이다.  따라서 97 -97 = 0)