[Silver V] 크로아티아 알파벳 - 2941
분류
구현, 문자열
문제 설명
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.
크로아티아 알파벳 | 변경 |
---|---|
č | 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
using namespace std;
int main() {
string list[8] = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};
string alpha;
string replace_str = "A";
cin >> alpha;
for (string s : list) {
while (alpha.find(s) != string::npos) {
alpha.replace(alpha.find(s), s.length(), replace_str);
}
}
cout << alpha.length();
}
설명
크로아티아 알파벳에 해당하는 글자를 입력된 문자열에서 찾아 다른 단일 문자로 대체하면 됩니다.
예를 들어, c=c=
의 경우 A
로 치환하면 AA
가 되어 총 문자열 길이는 2임을 쉽게 구할 수 있습니다.
1
#include <string>
먼저 문자열 관련 헤더파일을 불러와줍니다.
1
2
3
string list[8] = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};
string alpha;
string replace_str = "A";
크로아티아 알파벳들을 담은 배열을 하나 선언해줍니다. 입력 받을 문자열과 대체 문자열도 함께 선언합니다.
1
cin >> alpha;
문자열을 입력받습니다.
1
2
3
4
5
for (string s : list) {
while (alpha.find(s) != string::npos) {
alpha.replace(alpha.find(s), s.length(), replace_str);
}
}
메인이 되는 반복문 코드입니다.
가장 바깥의 for문은 크로아티아 알파벳 배열을 순차적으로 도는 foreach loop
입니다. 하나의 크로아티아 알파벳 s
마다 작업을 수행합니다.
while
문은 입력된 문자열에 크로아티아 알파벳이 존재하지 않을 때까지 이하의 작업을 수행합니다.
문자열 찾기
str.find(target)
은 문자열 str
에 target
이 존재하면 그 위치를 인덱스로 반환하고, 존재하지 않으면 string::npos
를 반환합니다.
문자열 대체하기
replace
함수로 문자열의 일부를 다른 문자열로 대체할 수 있습니다.
1
str.replace(index, length, replace_str);
대체할 부분의 인덱스, 대체할 부분의 길이, 대체할 대상을 인자로 받습니다.
위 코드에서는 find
함수로 인덱스를 전달하고, length
함수로 대체할 길이를 전달했으며, “A” 의 값을 가진 문자열 replace_str
을 전달했습니다.
1
cout << alpha.length();
정리된 문자열의 길이를 역시 length
함수를 통해 출력합니다.
length()
:
문자열의 길이를 정수로 반환합니다.