반응형


백준 - 단계별로 풀어보기 [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을 사용했는가 안했는가에 따라서 코드 길이 차이와 푸는 시간 차이가 클 것이라고 생각한다.

반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,