본문 바로가기
백준(C언어)/22년 7월

7월 20일(수) - 6단계(10809번)

by C0MPAS 2022. 7. 20.

6단계 - 10809번

 

10809번: 알파벳 찾기

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

www.acmicpc.net

 

문제점

1. a부터 z까지 각각 처음으로 등장하는 위치 혹은 등장하지 않는다면 -1 로 저장하는 alphabet[26] 이라는 배열을 설정

그리고 for(int i)와 for(int j)로 시작하는 반복문 안에서 if (word[j]==i) 인 경우에는 각각의 알파벳이 처음 등장한 위치저장,

아닌 경우(즉 word[j] 와 i 가 같지 않은 경우)에는 else로 처리하며 alphabet 배열에 -1을 저장하려했으나 너무 복잡함

-> alphabet 배열을 모두 -1로 채우는 반복문을 최초에 실행하도록 수정

 

2.  int j 로 시작하는 반복문의 판단조건을 word[j] != '0'으로 설정

-> 대부분의 문자열은 가장 마지막 저장으로 NULL을 저장한다는 것에서 착안했던 아이디어

-> 하지만 '0'이 아닌 word[j] != NULL로 설정해야 제대로 입력된 문자열의 가장 마지막을 판단해낼 수 있음

 

3. if (word[j]==i) 인 경우 해당 alphabet 배열에다가 j 값에 해당하는 값을 넣으려함

이때 j값을 넣게될 배열이, 해당 alphabet의 몇번째 배열인지를 어떤 식으로 표현할지가 가장 고민했던 부분

-> 이전 문제들에서 아스키코드를 활용했던 방법에서 착안하여, alphabet 배열중에서 [word[j] - 'a'] 번째에 j 값을 넣도록 작성

 

 

풀이

#include <stdio.h>

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

	for (int i = 0; i < 26; i++)
	{
		alphabet[i] = -1;
	}
	
	for (int i = 'a'; i<='z'; i++)
	{
		for (int j = 0; word[j] != NULL; j++)
		{
			if (word[j] == i)
			{
				alphabet[word[j] - 'a'] = j;
				break;
			}
		}
	}
	for (int i = 0; i<26; i++)
	{
		printf("%d ", alphabet[i]);
	}
	return 0;
}

 

출처:https://www.acmicpc.net/problem/10809

댓글