전체 코드
#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] << " ";
}
'백준 단계별로 풀어보기(C++) > 5)문자열' 카테고리의 다른 글
백준 1152) 단어의 개수 (C++) (0) | 2023.03.25 |
---|---|
백준 2675) 문자열 반복 (C++) (0) | 2023.03.25 |
백준 11720) 숫자의 합 (C++) (0) | 2023.03.25 |
백준 11654) 아스키 코드 (C++) (0) | 2023.03.25 |
백준 9086) 문자열 (C++) (0) | 2023.03.25 |