본문 바로가기
Algorithm/C++

백준 - 2941 - 크로아티아 알파벳 - C++ /String 내부 함수 find, replace

by imagineer_jinny 2021. 3. 6.

2941번: 크로아티아 알파벳 (acmicpc.net)

 

2941번: 크로아티아 알파벳

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=

www.acmicpc.net

 

문제

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.

크로아티아 알파벳변경

č c=
ć c-
dz=
đ d-
lj lj
nj nj
š s=
ž z=

예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.

입력

첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.

단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.

출력

입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

 

 

풀이

#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();
}

 

사용된 개념

 

벡터

일단 벡터도 동적 배열구조 클래스임. 

그럼 어떨때 쓰고 vector<string>은 왜 생각 못했을까? 이것도 익숙하지 않았고 string 자체도 그냥 string만 따로 쓰는거 아냐? 생각했던 것 같다. 유니티에서 많이 했잖아 벡터!!!! 그때 느낌이 약간 벡터는 여러개 많이 담을 수 있지..온갖거 담을 수 있지 생각했던 것 같다. 

 

String의 find 함수

string::find()

  • string 클래스의 멤버함수로서, str.find("찾는 문자") 로 사용

  • 반환값은 찾는 문자의 첫번째 인덱스값

  • 찾는 문자가 없을 경우는 string::npos를 리턴한다.
    (npos는 no position으로 쓰레기값 나옴)

#include <iostream>
#include <string>	//string::find()

using namespace std;

String str = "I want to be rich";

int main() {

	//rich 문자 유무 판단
	if (str.find("rich") != string::npos) {
    	cout << "찾는 문자가 존재합니다";

    	int index = str.find("rich");   //해당 문자의 시작 인덱스 반환
	}
}

 

String의 replace 함수

#include <algorithm>
#include <string>

int main() {
    std::string s = "example string";
    char from = 'e';
    char to = '!';
    std::replace( s.begin(), s.end(), from, to); // replace all 'x' to 'y'
    std::cout << s << endl;
}

 

복기

 

+벡터를 쓸 생각을 왜 못하지? 많이 안써봤으니까!!

일단 유니티로 인해 벡터에 대한 거부반응이 좀 크다. 그리고 여러번 설명 들어도 모르겠음.

하지만 익숙해져야 한다. 개념도 뭔가 알듯 말듯 하다. 차차 알아가는걸로.. 

 

오답 유형: find, replace 함수를 몰랐음

파이썬은 감도 안오고 C++로 도전할라고 봤는데 if문으로 크로아티아 문자를 다 케이스분류해서 카운팅해야하나 싶었다. 근데 그럼 =과 -은 어떻게 처리할 것이며 나오면 백해가지고 풀어야하나 싶고 근데 본능적으로 그렇게 푸는게 아니라는걸 확신했고 파이썬으로 넘어갔다. 이건 블로그 참고해서 풀이를 쓴다. 

 

[백준 / BOJ] - 2941번 크로아티아 알파벳 C++ 풀이 :: Just Give Me The Code (tistory.com)

 

[백준 / BOJ] - 2941번 크로아티아 알파벳 C++ 풀이

백준 - 단계별로 풀어보기 [2941] https://www.acmicpc.net/problem/2941 문제 최대 100글자의 문자열을 입력받고, 크로아티아 알파벳에 해당하는 문자들은 문자 1개로 계산하여 총 알파벳의 갯수를 세는 프로

cryptosalamander.tistory.com

 

댓글