티스토리 뷰
성공 코드(내 코드)
- 마침표가 두개 이상이면 하나로 치환하기 위해 fs 변수 사용
- .이 나오면 fs=1로 만들고
- 다음부터 .이 나오는 경우 fs가 1이면 연속해서 나오는 것이므로 해당 문자를 erase
- .이 아닌 조건에 만족하는 다른 문자가 나오면 fs=0으로 만든다.
- 나머지 단계는 흐름에 맞게 if문을 사용
#include <string>
#include <vector>
using namespace std;
string solution(string new_id) {
string answer = "";
int fs=0;
for(int i=0; i<new_id.size(); i++){
answer+=tolower(new_id[i]);
}
for(int i=0; i<answer.size(); i++){
if(answer[i]=='.'){
if(fs>0){
answer.erase(i--, 1);
continue;
}
}
if((answer[i]>=97 && answer[i]<=122) || (answer[i]>=48 && answer[i]<=57) || answer[i]=='-' || answer[i]=='_'){
fs=0;
continue;
} else if(answer[i]=='.'){
fs=1;
}else{
answer.erase(i--, 1);
}
}
if(answer[0]=='.'){
answer.erase(0, 1);
}
if(answer[answer.size()-1]=='.'){
answer.erase(answer.size()-1, 1);
}
if(answer.size()==0){
answer+="a";
}
if(answer.size()>=16){
answer.erase(15, answer.size()-1);
}
if(answer[answer.size()-1]=='.'){
answer.erase(answer.size()-1, 1);
}
if(answer.size()<=2){
char last=answer[answer.size()-1];
while(answer.size()!=3){
answer+=last;
}
}
return answer;
}
다른 사람 풀이
- string의 맨 앞 인자를 반환하는 front
- str1.front();
- string의 맨 뒤 인자를 반환하는 back
- str1.back();
- 문자열 내에 일치하는 문자가 있는지 검사하는 함수 strchr
- 첫번째 매개변수: 검사할 문자열
- 두번째 매개변수: 존재하는지 확인할 문자
- 문자가 존재하면 해당 문자가 존재하는 곳의 포인터를 반환하고 존재하지 않으면 널 포인터를 반환한다.
- strchr(str, 'M');
#include <bits/stdc++.h>
using namespace std;
string solution(string new_id) {
for (char& ch : new_id) if ('A' <= ch && ch <= 'Z') ch |= 32;
string ret;
for (char& ch: new_id) {
if ('a' <= ch && ch <= 'z' ||
'0' <= ch && ch <= '9' ||
strchr("-_.", ch)) ret += ch;
}
new_id = ret;
ret.clear();
for (char& ch: new_id) {
if (!ret.empty() && ret.back() == '.' && ch == '.') continue;
ret += ch;
}
if (ret.front() == '.') ret.erase(ret.begin());
if (ret.back() == '.') ret.pop_back();
if (ret.empty()) ret = "a";
if (ret.size() >= 16) ret = ret.substr(0, 15);
if (ret.back() == '.') ret.pop_back();
while (ret.size() <= 2) ret += ret.back();
return ret;
}
- 함수를 호출하는 스트링의 맨뒤에 있는 문자 하나를 없애는 함수 pop_back()
- str1.pop_back();
- 문자열의 일부를 리턴하는 substr
- 문자열.substr(시작 위치, 길이)
- 첫 번째 인수에는 시작 위치를, 두 번째 인수에는 취득하고 싶은 문자수를 지정한다.
- str1.substr(5, 1); // 5번째 인자부터, 1의 길이만큼 문자열을 반환
- 문자열의 사이즈를 반환하는 size
- str1.size();
#include <bits/stdc++.h>
using namespace std;
bool isok(char x) {
if (islower(x) || isdigit(x) || x == '-' || x == '_' || x == '.') return 1;
return 0;
}
string solution(string new_id) {
string tmp ="";
for (char &c : new_id) if (isupper(c)) c = tolower(c);
for (char c : new_id) if (isok(c)) tmp += c;
new_id = "";
for (int i = 0; i < tmp.size(); i++)
if (tmp[i] != '.' || (!new_id.empty() && new_id.back() != '.')) new_id += tmp[i];
if (new_id.back() == '.') new_id.pop_back();
if (new_id.front() == '.') new_id = new_id.substr(1);
if (new_id.empty()) new_id.push_back('a');
if (new_id.size() >= 16) new_id = new_id.substr(0, 15);
while (new_id.back() == '.') new_id.pop_back();
while (new_id.size() <= 2) new_id += new_id.back();
return new_id;
}
'알고리즘' 카테고리의 다른 글
[프로그래머스/c++] 성격 유형 검사하기 (0) | 2022.08.26 |
---|---|
[프로그래머스/c++] 같은 숫자는 싫어 (0) | 2022.08.26 |
[프로그래머스/c++] 숫자 문자열과 영단어 (0) | 2022.08.24 |
[프로그래머스/c++] 키패드 누르기 (0) | 2022.08.24 |
[프로그래머스/c++] 크레인 인형뽑기 게임 (0) | 2022.08.24 |