백준 - 단계별로 풀어보기 [10809] 알파벳 찾기
https://www.acmicpc.net/problem/10809
문제
알파벳 소문자로만 이루어진 단어를 입력받고, a~z 각각의 알파벳에 대해서 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하는 문제이다.
풀이
char 배열을 활용하여 문제를 풀어도 되겠지만, C++에서 제공하는 string STL을 활용하면 아주 간단하게 풀 수 있는 문제이다.
string STL의 find 함수는 입력 문자열이 최초로 등장하는 위치의 인덱스를 반환하는 함수이다. 즉 위 문제의 경우 'a' 'b' 'c' ... 등등에 대한 find만 수행해주면 된다는 의미이다.
사용법은 아래와 같다.
#include <iostream>
#include <string>
using namespace std;
int main() {
string a = "abc";
cout << a.find('a') << '\n';
cout << a.find('b') << '\n';
cout << a.find('c') << '\n';
cout << a.find('d') << '\n';
return 0;
}
/*
실행 결과
0
1
2
18446744073709551615 (unsigned형의 -1이므로 표현할 수 있는 최대 크기의 양수)
*/
만약 없는 문자열을 찾으려 할 경우에는 string::npos가 반환된다.
npos의 값은 -1로 정의되어있지만, string::npos의 자료형이 unsigned이므로 2의 보수 개념에 의해 표현할 수 있는 최대 크기의 양수가 출력된다. 이를 방지하기 위해서는 unsigned가 아닌 일반 int형으로 캐스팅을 진행하여 출력하면 된다.
cout << (int)a.find('d') << '\n';
이렇게 출력할 경우 정상적으로 -1을 받아오는 것을 확인할 수 있다.
코드
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
string alphabet = "abcdefghijklmnopqrstuvwxyz";
cin >> s;
for(int i = 0; i < alphabet.length(); i++)
cout << (int)s.find(alphabet[i]) << " ";
return 0;
}
평가
C++이 편리한 이유중 하나인 string을 활용할 수 있다면 보다 쉽게 풀 수 있는 문제였다.
문제 난이도 자체는 높지 않지만, string의 멤버 함수인 find를 연습할 수 있다는 점에서 포스팅을 진행하였다.
정답률은 50%이상으로 평이하지만, STL을 사용했는가 안했는가에 따라서 코드 길이 차이와 푸는 시간 차이가 클 것이라고 생각한다.
'Algorithm > Baekjoon BOJ' 카테고리의 다른 글
[백준 / BOJ] - 1018번 체스판 다시 칠하기 C++ 풀이 (1) | 2020.02.06 |
---|---|
[백준 / BOJ] - 1157번 단어 공부 C++ 풀이 (0) | 2020.02.03 |
[백준 / BOJ] - 4344번 평균은 넘겠지 C++ 풀이 (0) | 2020.01.29 |
[백준 / BOJ] - 10951번 A+B-4 C++ 풀이 (0) | 2020.01.28 |
[백준 / BOJ] - 10172번 개 C++ 풀이 (0) | 2020.01.28 |