백준 - 단계별로 풀어보기 [2941]
https://www.acmicpc.net/problem/2941
문제
최대 100글자의 문자열을 입력받고, 크로아티아 알파벳에 해당하는 문자들은 문자 1개로 계산하여 총 알파벳의 갯수를 세는 프로그램을 작성하는 문제이다.
풀이
해당 문제는 단순 if문으로 풀기보다는 크로아티아 알파벳에 해당하는 문자열들을 벡터로 선언하고, 이와 일치하는 문자열들을 변환하는 방식으로 풀 수 있다.
vector<string> croatian = {"c=","c-","dz=","d-","lj","nj","s=","z="};
그리고 String의 find 함수를 활용하여 일치하는 문자열을 String의 replace를 활용하여 #으로 변경해준뒤, 문자열의 길이를 구하면 총 크로아티아 알파벳의 개수를 구할 수 있다.
for(int i = 0; i < croatian.size(); i++)
{
while(1){
idx = str.find(croatian[i]);
if(idx == string::npos)
break;
str.replace(idx,croatian[i].length(),"#");
}
}
위의 코드를 실행하며 크로아티아 알파벳에 해당하는 문자열들을 find를 통해 검색하고, find의 결과값이 npos가 나올 때 까지, 즉 모든 문자열을 찾을 때까지 while문을 통해 문자열을 변경해준다.
즉, c=, c-, dz=, d-, ...등등에 해당하는 문자열을 만나면 이를 #으로 변경해준다.
예시로 주어진 ljes=njak의 경우엔 #e##ak로 변경되어 문자열의 길이는 6을 반환하게 된다.
코드
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
vector<string> croatian = {"c=","c-","dz=","d-","lj","nj","s=","z="};
int idx;
string str;
cin >> str;
for(int i = 0; i < croatian.size(); i++)
{
while(1){
idx = str.find(croatian[i]);
if(idx == string::npos)
break;
str.replace(idx,croatian[i].length(),"#");
}
}
cout << str.length();
}
평가
본 문제는 string의 내부함수인 find와 replace등을 활용할 수 있는가, 없는가에 따라서 난이도가 달라질 수 있다고 생각한다.
단순히 모든 문자열을 if문으로 처리하는 경우에는 풀이는 간단하지만 코드 길이가 매우 난잡하게 길어질 수 있으며, dz=과 z=을 구분하기 위해 별도의 예외처리가 필요하므로, find를 활용하여 치환하는 방식이 효율적인 풀이 방법이라고 생각한다.
본 문제에서는 string 내부함수 find와 replace의 사용법을 익힐 수 있다.
'Algorithm > Baekjoon BOJ' 카테고리의 다른 글
[백준 / BOJ] - 1712번 손익분기점 C++ 풀이 (0) | 2020.02.10 |
---|---|
[백준 / BOJ] - 1316번 그룹 단어 체커 C++ 풀이 (0) | 2020.02.09 |
[백준 / BOJ] - 1152번 단어의 개수 C++ 풀이 (0) | 2020.02.06 |
[백준 / BOJ] - 1018번 체스판 다시 칠하기 C++ 풀이 (1) | 2020.02.06 |
[백준 / BOJ] - 1157번 단어 공부 C++ 풀이 (0) | 2020.02.03 |