백준 단계별로 풀어보기(C++)/5)문자열

백준 10809) 알파벳 찾기 (C++)

코테 2023. 3. 25. 19:36

전체 코드

#include <iostream>

int main()
{
	char c[101];
	int alpha[27];
	int idx = 0;
	std::cin >> c;
	
	for (int i = 0; i < 27; i++)
	{
		alpha[i] = -1;
	}

	while (c[idx] != '\0')
	{
		if(alpha[(int)c[idx] - 96] == -1)
			alpha[(int)c[idx] - 96] = idx;
		idx++;
	}

	for (int i = 1; i <= 26; i++)
	{
		std::cout << alpha[i] << " ";
	}
}

풀이

  • char 배열 선언, 단어는 100글자를 안넘는다하지만 글자끝에 항상 '\0'이 들어가는것을 고려해서 다음과 같이 선언
char c[101];
  • 알파벳별 순서 위치를 배열로 통해 나타낼 것, 인덱스를 1부터 26까지 사용하기 위해(0번 인덱스 버림) alpha[26]이 아닌 alpah[27]로 배열 선언
  • 27번 반복하는 for문을 통해 전체 값을 -1로 초기화
int alpha[27];

for (int i = 0; i < 27; i++)
{
	alpha[i] = -1;
}
  • 배열값 '\0'을 만날때까지 계속 반복하는 반복문(=문자열 끝에 도달하면 종료하는 반복문)
  • if문 : 값이 -1일때만 값 갱신-> 값이 있는 경우 이미 첫 글자 자리를 찾았단 뜻이므로 다시 갱신되면 안됨
  • 값을 idx로(현재 글자의 위치) 갱신
  • 다음 글자를 검사하기위해 idx 값 1 더함

 

  • alpha[(int)c[idx] - 96] = 알파벳 순서를 인덱스 값으로 씀
  • 예로들어서 c[idx]가 a라면 최종 인덱스가 1이 나오게 z라면 최종 인덱스가 26이 나오게 설정,
  • c가 char 형태라 int로 형변환해서 아스키 코드값 얻은 뒤 96뺌으로서 알파벳 순서값 얻음 
while (c[idx] != '\0')
{
	if(alpha[(int)c[idx] - 96] == -1)
		alpha[(int)c[idx] - 96] = idx;
	idx++;
}

 

아스키코드문자 10진수값 아스키코드문자 10진수값 아스키코드문자 10진수값
'a' 97 'k' 107 'u' 117
'b' 98 'l' 108 'v' 118
'c' 99 'n' 109 'w' 119
'd' 100 'm' 110 'x' 120
'e' 101 'o' 111 'y' 121
'f' 102 'p' 112 'z' 122
'g' 103 'q' 113    
'h' 104 'r' 114    
'i' 105 's' 115    
'j' 106 't' 116    

 

  • 1부터 시작해 26에 끝나는 for문
  • 차례대로 값 출력
for (int i = 1; i <= 26; i++)
{
	std::cout << alpha[i] << " ";
}