[C++] 백준 2941번 크로아티아 알파벳
https://www.acmicpc.net/problem/2941
2941번: 크로아티아 알파벳
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=
www.acmicpc.net
코드
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<string> croatian = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=" ,"z=" };
string n;
cin >> n;
int idx;
for (int i = 0; i < croatian.size(); i++)
{
while (1)
{
idx = n.find(croatian[i]);
if (idx == string::npos)
break;
n.replace(idx, croatian[i].length(), "#");
}
}
cout << n.length() << endl;
}
풀이
처음에 문제를 봤을 때 어떻게 해야하는지 고민이 조금 있었습니다. 그래서 생각한 방법이 만약 croatian 문자를 찾았을 때 해당 문자를 길이가 1인 임의의 문자로 바꾼 다음 length를 얻는 방식으로 해결했습니다.
먼저 저는 vector로 값을 묶어주었으며 for문과 while문 그리고 find와 replace문을 써주었습니다. 다른 사람들도 거의 이런 식으로 풀었을 것이라 생각이 듭니다.
1. 크로아티아 알파벳 string 문자열 만들어주기, 입력받을 단어 n 정의, 크로아티아 알파벳의 위치를 세줄 idx 정의
vector<string> croatian = { "c=", "c-", "dz=", "d-", "lj", "nj", "s=" ,"z=" };
string n;
cin >> n;
int idx;
먼저 이런식으로 정의를 해줍니다. vector 대신 string을 써줘도 상관없습니다. 어차피 해당 croatian문자는 8개로 고정이 되어있으니깐요.
2. for문을 통해 n.find(arr[i])로 위치 찾아주기, replace를 통해 바꿔주기
for (int i = 0; i < croatian.size(); i++)
{
while (1)
{
idx = n.find(croatian[i]);
if (idx == string::npos)
break;
n.replace(idx, croatian[i].length(), "#");
}
}
n.replace() 함수는 문자열 n에서 특정 문자열을 찾아 다른 문자열로 대체하는 데 사용됩니다.
replace 사용법
n.replace(start_index, length, replacement_string)
먼저 처음에 대체할 부분의 문자열의 시작 인덱스를 정의해주고, length(길이)를 정의해주고, replacement_string)대체할 부분 문자열을 나타내는 문자열입니다.
n.find() 함수는 문자열 n에서 특정 부분 문자열을 찾을 때 사용됩니다.
find 사용법
n.find(search_string, start_index)
처음에 나오는 것은 바로 검색할 부분 문자열입니다. start_index는 선택사항이므로 제 코드처럼 빼셔도 되는데요. 바로 검색을 시작할 index입니다. 생략될 경우 문자읠 처음부터 출력합니다.
find의 결과는 찾고자 하는 부분 문자열이 해당 문자열에서 처음 발견된 위치의 인덱스입니다.
만약 문자열이 없을 경우 string::npos를 반환합니다.
따라서 find 개념을 알고 있어야 이 문제를 풀 수있는데요. find는 찾은 문자열이 없을 경우 string::npos를 반환해줍니다. 만약에 찾을 경우 해당 위치의 인덱스를 반환해줍니다.
3. 길이 출력
cout << n.length() << endl;
결과에 나오는 길이를 출력해주면 됩니다. 정상적으로 실행이 될 경우 크로아티아 문자는 #문자로 대체되었기 때문에 정상적으로 값이 나옵니다.
해당 문제에서 주의할 점
- find는 찾을 시 해당 위치의 인덱스, 못 찾을 시에 string::npos를 반환해준다.
- replace는 n.replace(시작점, 바꿀 길이, 바꿀 문자) 이런 식으로 만들어준다.