2021. 2. 23. 17:00ㆍ필요/코딩테스트(프로그래머스)
문제
programmers.co.kr/learn/courses/30/lessons/72410
풀이
#include <string>
#include <vector>
using namespace std;
string solution(string new_id) {
for (int i=0; i<new_id.size(); i++) { // 1단계 적용
if (new_id[i]>=65 && new_id[i]<=90) {
new_id[i]+=32;
}
}
string next_id = "";
for (int i=0; i<new_id.size(); i++) { // 2단계 적용
if ((new_id[i]>=97 && new_id[i]<=122)||(new_id[i]>=48 && new_id[i]<=57) || new_id[i]=='-' || new_id[i]=='_' || new_id[i]=='.') {
next_id+=new_id[i];
}
}
new_id.clear();
for (int i=0; i<next_id.size(); i++) { // 3단계 적용
if (next_id[i]=='.') {
if (next_id[i]!=next_id[i-1]) {
new_id+=next_id[i];
}
}
else {
new_id+=next_id[i];
}
}
if (new_id[0] == '.') new_id.erase(0, 1); // 4단계 적용
if (new_id[new_id.size()-1] == '.') new_id.erase(new_id.size()-1, 1);
if (new_id.empty()) new_id+='a'; // 5단계 적용
if (new_id.size() >= 16) new_id.erase(15); // 6단계 적용
if (new_id[new_id.size()-1] == '.') new_id.erase(new_id.size()-1, 1);
for (int i=new_id.size()-1; i<2; i++) // 7단계 적용
new_id+=new_id[i];
return new_id;
}
개념
C++의 string에 관한 문법을 많이 사용한다.
추가
+=를 사용해서 문자열 추가 또는 문자 수정이 가능하다.
next_id+=new_id[i];
값은 next_id의 끝부분에 추가된다.
new_id[i]+=32;
문자열 new_id의 인덱스에 해당하는 값(문자)에 + 32가 된다.
삭제
다음 두 식을 구분할 수 있어야 한다.
new_id.erase(0, 1)
이는 0번째 인자부터 1개의 문자열을 제거하는 뜻이다.
new_id.erase(0)
이는 0번째 인자부터 문자열 끝까지 제거한다.
기타
new_id.size()
문자열의 길이를 나타낸다.(배열의 인자처럼 사용하려면 -1을 해야한다)
new_id.clear()
들어 있는 문자열을 비운다.
new_id.empty()
문자열이 텅빈 경우 true를 반환한다.
풀이
주어진 7단계 순서대로 문제를 해결했다.
몇 개의 단계를 묶으면 좀 더 간단해 질 것 같으나, 반드시 선행되어야 하는 부분이 있었다.
step1
일단 문자열의 요소가 대문자인 경우를 if문으로 받아서 +32를 해서 소문자로 바꾼다.
step2
문자열 요소가 소문자 or 숫자 or ' . ' or ' _ ' or ' - ' 인 경우, 새로운 문자열 next_id에 대입한다.
step3
new_id를 clear한다.
next_id를 탐색하며 요소가 ' . ' 이며 이전 요소도 ' . '이 아니라면 new_id에 대입한다.
애초에 ' . '이 아니여도 new_id 에 대입한다.
step4
첫번째 index와 마지막 index가 각각 ' . ' 일 때 erase한다.
step5
문자열이 텅빈 경우 문자 a를 추가한다.
step6
문자열이 16보다 길 때, erase(15)를 사용해서 뒷부분을 모두 제거한다.
그리고 step4와 동일하게 마지막 index가 ' . ' 일 때 erase한다.
step7
문자열의 길이가 3보다 작을 때, 마지막번째의 문자를 문자열을 더 추가한다.
반복문 전에 if를 사용하지 않는 것은, for문 안의 반복에도 조건이 있기 때문이다.
'필요 > 코딩테스트(프로그래머스)' 카테고리의 다른 글
[프로그래머스/C++] ㅡ LV1 - K번째수 (0) | 2021.02.24 |
---|---|
[프로그래머스/C++] ㅡ LV1 - 모의고사 (0) | 2021.02.24 |
[프로그래머스/C++] ㅡ LV1 - 완주하지 못한 선수 (0) | 2021.02.23 |
[프로그래머스/C++] ㅡ LV1 - 두 개 뽑아서 더하기 (0) | 2021.02.21 |
[프로그래머스/C++] ㅡ LV1 - 크레인 인형뽑기 게임 (0) | 2021.02.21 |