728x90
programmers.co.kr/learn/courses/30/lessons/72410
C++ 문자열 코딩테스트 연습
2021 카카오 블라인드 코테 문제
- 아이디의 길이는 3자 이상 15자 이하여야 합니다.
- 아이디는 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 문자만 사용할 수 있습니다.
- 단, 마침표(.)는 처음과 끝에 사용할 수 없으며 또한 연속으로 사용할 수 없습니다.
문자열을 이런 규칙을 만족하도록 수정하는 문제
string 메서드 찾아보면 쉽게 풀 수 있었겠지만..최대한 아는 선에서 해보려고 좀 오래 걸렸다.
마침표 연속으로 쓴 것 제외하는 부분에서 가장 시간을 많이 썼다. erase 쓰는게 익숙하지 않아서 그랬던 것 같다.
백준에서 문자열 너무 안쓰다보니까 역시 퇴화함..
문제에 7단계를 순차적으로 처리하는 코드를 짜라고 되어있지만 최대한 반복문 적게쓰고 해결할 수 있는 방법 찾다가
어차피 7단계면 7n이니까 시간복잡도가 그렇게 클 것 같진 않아서 그냥 순차적으로 처리하기로 했다.
오답노트
erase(iter, iter)랑 erase(index, cnt) 쓰는 경우를 헷갈려서 마지막에 오류났었다.
나머지는 무난하게 푼 듯
소스코드
#include <string>
#include <vector>
using namespace std;
string solution(string new_id) {
string answer = "";
for(int i = 0 ; i < new_id.length() ; i++){
if(new_id[i] >= 65 && new_id[i] <= 90){
answer += tolower(new_id[i]);
continue;
}
if((new_id[i] >= 48 && new_id[i] <= 57)||(new_id[i] >= 96 && new_id[i] <= 122) || new_id[i] == '-' || new_id[i] == '_' || new_id[i] == '.'){
answer += new_id[i];
}
}
int cnt = 0;
for(int i = 0 ; i < answer.length() ; i++){
if(answer[i] == '.'){
cnt++;
}else{
if(cnt > 1){
answer.erase(i-cnt,cnt-1);
i = i-(cnt-1);
cnt = 0;
}
else if(cnt == 1){
cnt = 0;
}
}
}
while(answer.front() == '.'){
answer.erase(answer.begin());
}
while(answer.back() == '.'){
answer.pop_back();
}
while(answer.length() > 15){
answer.pop_back();
}
if(answer.back() == '.'){
answer.pop_back();
}
while(answer.length() <= 2){
if(answer.length() == 0){
answer = "a";
}
answer += answer.back();
}
return answer;
}
728x90
'알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스] 알고리즘 73일차 : 3진법 뒤집기 (0) | 2021.01.27 |
---|---|
[프로그래머스] 알고리즘 72일차 : 소수 찾기 (0) | 2021.01.26 |
[프로그래머스] 알고리즘 70일차 : 두 개 뽑아서 더하기 (0) | 2021.01.21 |
[프로그래머스] 알고리즘 69일차 : 크레인 인형뽑기 게임 (0) | 2021.01.20 |
[백준 10867] 알고리즘 68일차 : 중복 빼고 정렬하기 (0) | 2021.01.19 |