2941번: 크로아티아 알파벳 (acmicpc.net)
문제
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.
크로아티아 알파벳변경
č | c= |
ć | c- |
dž | 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)
'Algorithm > C++' 카테고리의 다른 글
프로그래머스 - 2017 팁스타운 -예상 대진표 - C++ / 기본 수학 (0) | 2021.06.27 |
---|---|
백준 - 10250- ACM 호텔 - C++/ 나머지, 몫 활용 (0) | 2021.03.08 |
백준 - 4344 - 평균은 넘겠지 - C++ / 2차원 배열 동적 할당 (0) | 2021.03.08 |
백준 - 2869 - 달팽이는 올라가고 싶다 - C++ /시간초과, 수식활용 (0) | 2021.03.08 |
백준 - 1157 - 단어공부 - C++ /예외조건삽입 (0) | 2021.03.07 |
댓글