1. 문제 상세
https://www.acmicpc.net/problem/10809
2. 문제 접근
알파벳 소문자로 이루어진 단어를 입력받고,
알파벳(a, b, c, d, e, ... z)들이단어의 몇 번째 자리에 있는지 확인하여 위치를 출력한다.
알파벳이 단어에 없는 경우 -1 을 출력하자.
크기가 26인 정수 배열을 하나 만들고, 인덱스를 알파벳과 매치해보자. (0 = a, 1 = b, 2 = c, ... 25 = z)
반복문을 사용하여 문자열의 크기만큼 반복하도록 한다.
반복에서는 문자열 맨 앞에서 부터 문자를 가져와 확인하자.
이 때, 문자를 가져와 확인하기 때문에 아스키 코드를 활용해보자.
아스키 코드에서 알파벳 소문자는 a 부터 순서대로 97~122 까지이다.
따라서 문자열에서 문자를 가져와 해당 문자의 아스키 코드 값에서 97을 빼주면
정수 배열에서의 매치와 같이 a = 0, b = 1, c = 2, ... z = 25 와 같은 값이 나오게 된다.
이렇게 문자-97 의 값을 정수 배열의 인덱스로 사용하여 정수 배열에 접근,
해당 인덱스의 값을 반복문의 카운터 변수 값으로 저장하여 해당 문자의 위치를 저장하자.
물론 이전에 정수 배열의 값을 모두 -1로 초기화 하고, 문자의 위치를 저장할 때
처음 등장하는 위치를 저장하기 위해서(뒤에 나온 위치가 덮어쓰지 않기 위해서)
조건문으로 해당 인덱스의 값이 -1인지 확인하고 저장하게 하자.
3. 문제 풀이
#include <iostream>
using namespace std;
int main() {
int a[26];
string s;
cin >> s;
for(int i = 0; i < 26; i++) a[i] = -1;
for(int i = 0; i < s.size(); i++) {
if(a[s[i] - 97] == -1) a[s[i] - 97] = i;
}
for(int i = 0; i < 26; i++) cout << a[i] << " ";
}
크기가 26인 정수형 배열 a 를 선언. 문자열 객체 s 를 생성.
cin 으로 단어를 입력받아 s 에 저장한다.
for문으로 정수 배열 a의 모든 값을 -1로 초기화한다.
for문으로 i 가 0부터 s.size(), 문자열 s 의 크기보다 작을 때 1씩 더하며 반복하도록 한다.
반복에서는 조건문으로 문자열 s 의 i 번 인덱스 의 값에서 97을 뺀 값을 정수 배열 a 의 인덱스로,
배열 a 의 해당 인덱스 값이 -1인 경우 그 값을 i 로 저장한다.
위 반복문이 끝나면 for문으로 정수 배열 a 를 출력한다.
4. 성능 확인
5. 마무리
아스키 코드를 활용하여 알파벳을 일정 숫자들에 매치하는 방법을 사용해보았다.
아스키 코드를 자주 활용해보자.
'백준 - 단계별로 풀어보기 > 문자열' 카테고리의 다른 글
[백준] 1152번 : 단어의 개수 | C++ (0) | 2023.09.25 |
---|---|
[백준] 2675번 : 문자열 반복 | C++ (0) | 2023.09.25 |
[백준] 11720번 : 숫자의 합 | C++ (0) | 2023.09.25 |
[백준] 11654번 : 아스키 코드 | C++ (0) | 2023.09.22 |
[백준] 9086번 : 문자열 | C++ (0) | 2023.09.22 |