문제 바로가기
https://www.acmicpc.net/problem/10809


관련 알고리즘
- ASCII 코드
정답 및 해설
알파벳 소문자로만 이루어진 문자열을 받아서 알파벳이 몇번째에 처음으로 등장하는지 묻는 문제이다.
알파벳의 위치를 저장할 배열을 만들고, 알파벳이 없는 경우 -1을 출력해야 하므로 먼저 -1로 초기화 시킨다.
그 후 입력받은 문자열의 알파벳을 하나씩 살펴보면서 해당 알파벳이 처음 등장했다면 해당 인덱스값으로 설정한다.
문자별 배열의 순서는 ASCII 코드값으로 문자열의 문자를 변수 s에 저장하면 s-'a' 번째 알파벳으로 계산할 수 있다.
C++
더보기
#include<bits/stdc++.h>
using namespace std;
int main(){
string str;
int alpha[26],i;
memset(alpha,-1,sizeof(alpha));
cin>>str;
for(i=0; i<str.length(); i++)
if(alpha[str[i]-'a']==-1)
alpha[str[i]-'a']=i;
for(i=0; i<26; i++)
cout<<alpha[i]<<' ';
}
| Line | 해설 |
| 4~5 | 입력받을 문자열 str과 알파벳의 등장 위치를 저장할 배열 alpha를 정의했다. |
| 6 | memset 함수를 사용하여 alpha 배열의 값을 모두 -1로 초기화했다.1) |
| 7 | string타입 변수 s에 문자열을 입력받는다. |
| 8~10 | 변수 i를 0부터 시작해서 문자열(str)의 길이(.length())까지 반복한다. str[i]는 str문자열의 i번째 문자를 나타내므로 str[i]-'a'는 해당 문자와 'a'의 ASCII 코드값 차이가 된다. 즉, alpha 배열의 해당 문자의 인덱스가 되므로 alpha[str[i]-'a']로 하여 등장 위치를 확인할 수 있다. if 조건문으로 alpha 배열의 해당 문자 위치가 -1인 경우 처음 등장한 문자로 판단하여 값을 i번째로 설정한다. |
| 12~13 | for 반복문으로 i를 0부터 26까지 반복하며 각 알파벳의 최초 등장위치를 출력한다. |
1) 배열을 초기화하는 방법에는 여러가지가 있다. 값 지정, memset, fill, fill_n 등이 있는데 추후에 다루기로 한다.
memset(변수명, 값, 메모리크기) : (변수명)에서 (메모리크기)만큼의 메모리를 (값)으로 세팅
'Coding > BOJ' 카테고리의 다른 글
| [BOJ 백준] 11720 - 숫자의 합 (C++ / Python) (0) | 2023.11.14 |
|---|---|
| [BOJ 백준] 10818 - 최소, 최대 (C++) (0) | 2023.11.14 |
| [BOJ 백준] 10250 - ACM 호텔 (C++ / Python) (1) | 2023.11.11 |
| [BOJ 백준] 8958 - OX퀴즈 (C++) (0) | 2023.11.10 |
| [BOJ 백준] 3052 - 나머지 (C++ / Python) (1) | 2023.11.09 |