1. isdigit
아스키 코드표에서 숫자('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')로 변환할 수 있는 값이 들어오면 True를 반환
string str = "1a2b";
bool tmp1 = isdigit(str[0]); //tmp1 = true
bool tmp2 = isdigit(str[1]); //tmp2 = false
2. toupper
인자로 입력받은 문자를 대문자로 바꾼다. (소문자는 tolower)
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(string myString) {
string answer = "";
for(auto iter : myString)
answer += toupper(iter);
return answer;
}
주의할 점!!!
transform을 이용해도 똑같은 기능을 만들 수 있다.
하지만 using namespace std가 선언되어 있을 경우 (컴파일러에 따라 다른 결과를 내긴 했지만 적어도 프로그래머스에서는) transform 내부의 함수 포인터 toupper가 <locale>에 들어있는 인자를 두 개나 받는 std::toupper와 충돌을 일으키는 것 같다.
(위의 코드에서는 인자로 (iter)를 주는 것으로 자동 오버로딩 시키지만 아래에서는 함수 포인터?로? 사용해서 인자를 받지 않으므로 어떤 것으로 오버로딩할지 컴파일러가 결정하지 못한다?아마도?)
하지만 std::toupper는 우리가 사용하고 싶은 toupper (<ctype.h> 혹은 <cctype>에 들어있음)와 다르므로 transform의 인자로 사용할 수 없다.
따라서 ::toupper를 사용하여 전역 스코프에서 해당 함수를 찾아주어야 한다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(string myString) {
transform(myString.begin(), myString.end(),myString.begin(),::toupper);
return myString;
}
아니면 다음과 같이 using namespace std를 사용하지 않는 방법도 있다.
#include <vector>
#include <algorithm>
std::string solution(std::string myString) {
transform(myString.begin(), myString.end(),myString.begin(),toupper);
return myString;
}
아니면 람다식을 사용하거나 함수 포인터 타입 변환으로 강제 오버로딩 시키는 방법도 있는 것 같다....
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(string myString) {
transform(myString.begin(), myString.end(),myString.begin(), [](unsigned char c){ return toupper(c);});
return myString;
}
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(string myString) {
transform(myString.begin(), myString.end(),myString.begin(), (int (*)(int))toupper);
return myString;
}
3. stoi(str)
문자열 str을 int로 변환해 반환
#include <string>
#include <vector>
using namespace std;
//n_str을 int형 정수로 변환해 반환
int solution(string n_str) {
return stoi(n_str);
}
4. to_string(num)
숫자 num을 string 형식 문자열로 변환해 반환
#include <string>
#include <vector>
using namespace std;
//입력받은 int형 정수 n을 string으로 반환
string solution(int n) {
return to_string(n);
}
5. stringstream
한 줄로 들어온 데이터에서 공백과 '\n'을 제외하고 문자열에서 맞는 자료형의 정보를 꺼냄
<sstream> 필요
#include <string>
#include <vector>
#include <sstream>
using namespace std;
vector<string> solution(string my_string) {
vector<string> answer;
string str;
stringstream ss;
ss.str(my_string); //현재 stream의 값을 문자열로 바꿈
while(ss >> str)
answer.emplace_back(str);
return answer;
}
6. regex_replace(string, regex("data"), "newdata")
문자열 string에서 data를 찾아 newdata로 치환
<regex> 필요
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main(void)
{
string str = "AAABBBCCC";
str = regex_replace(str, regex("A"), "D"); //DDDBBBCCC
}
7. distance(first, last)
first에서 last 까지 거리가 얼마인지 반환
#include <string>
#include <vector>
using namespace std;
//arr 원소의 총 합 출력
int solution(vector<int> arr) {
int dist = distance(arr.begin(),arr.end());
return dist;
}
8. advance(iter, value)
iter를 value만큼 이동
#include <string>
#include <vector>
using namespace std;
//arr 원소의 총 합 출력
int solution(vector<int> arr) {
auto iter = arr.begin();
advance(iter,3); //iter를 3만큼 다음으로 움직인다
}
9. swap(value1, value2)
두 값을 서로 교환한다
#include <string>
#include <vector>
using namespace std;
//문자열 my_string의 [num1]과 [num2]를 바꾸어 출력한다
string solution(string my_string, int num1, int num2) {
swap(my_string[num1],my_string[num2]);
return my_string;
}
10. 특수 문자 출력하기
cout 으로 출력할 때 몇몇 특수문자는 출력이 안된다
' (작은따옴표), " (큰따옴표)는 앞에 \를 붙인다(\' \")
\본인을 출력하고자 할 때에도 \\와 같이 사용한다
#include <iostream>
using namespace std;
//원하는 결과: !@#$%^&*(\'"<>?:;
int main(void) {
//cout으로 특수 문자 출력하려면 앞에 \ 붙여야함
cout << "!@#$%^&*(\\'\"<>?:;";
return 0;
}