2019. 11. 12. 10:50ㆍ알고리즘/백준
문제
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.
크로아티아 알파벳변경
č | c= |
ć | c- |
dž | dz= |
đ | d- |
lj | lj |
nj | nj |
š | s= |
ž | z= |
예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.
dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.
입력
첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.
단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.
출력
입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.
예제 입력 1
ljes=njak
예제 출력 1
6
예제 입력 2
ddz=z=
예제 출력 2
3
예제 입력 3
nljj
예제 출력 3
3
예제 입력 4
c=c=
예제 출력 4
2
문제 풀이
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<string> vec = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};
int index = 0;
string S;
cin>>S;
for(int i=0; i<vec.size(); i++){
index = S.find(vec[i]);
for(; index != string::npos; index = S.find(vec[i]))
S.replace(index, vec[i].length(), "@");
}
cout<<S.length();
}
string.find("") 함수는 파라미터로 받은 문자열이 string에 포함되어 있는지 확인하는 함수입니다.
문자열이 존재한다면 해당 문자열이 시작되는 처음 위치를 리턴합니다.
문자열이 존재하지 않는다면 string::npos를 리턴합니다.
여러 방법이 있지만 저는 크로아티아 알파벳이 있는지 확인한 뒤,
그 입력받은 문자열의 시작 위치부터 길이만큼 잘라내기를 생각했었습니다.
하지만 잘라냈을 경우 for 문에서의 문제도 생기고,
앞의 문자와 뒤의 문자가 합쳐지면서 크로아티아 알파벳이 완성되면 안 되기 때문에 string.replace() 함수를 사용하여 문자열을 전혀 상관없는 특수문자로 대체하였습니다.
string.replace() 함수의 각 파라미터 뜻은 string.replace(문자열의 시작 위치, 문자열의 길이, 대체 문자)입니다.
replace 함수가 문자열 길이에 제약받지 않으므로 @ 하나로 대체한 뒤,
최종적으로 문자열 길이를 구하게 되면 일반 알파벳들 개수 + 대체된 크로아티아 알파벳(@) 개수가 됩니다.
출처 : https://www.acmicpc.net/problem/2941
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2750번 수 정렬하기 C++ 문제 풀이 정렬 (0) | 2019.11.16 |
---|---|
[백준] 1316번 그룹 단어 체커 C++ 문제 풀이 문자열 (0) | 2019.11.13 |
[백준] 5622번 다이얼 C++ 문제 풀이 문자열 (2) | 2019.10.12 |
[백준] 2908번 상수 C++ 문제 풀이 문자열 (0) | 2019.10.09 |
[백준] 1152번 단어의 개수 C++ 문제 풀이 문자열 (0) | 2019.10.04 |