||문제 이해
제시된 7단계의 문자열 규칙에 따라 입력받은 문자열을 변경
||해결 계획
단순 문자열 다루기 구현이라 어떠한 함수를 사용할지 고민을 했다.
좀 생각했던건
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다
이 연속된 마침표를 하나만 남기고 어떻게 제거할까 생각하다가
중복? unique? 이렇게 생각이 나서 unique를 해보면 어떨까 생각했고
정렬을 하지 않은 원상태 그대로의 연속된 중복제거이기에 unique가 정말 잘 어울린다고 결론을 내렸다.
나머지는 erase, front, back, begin, end, size 를 통해 쉽게 구현이 가능하다.
||계획 검증
모두 단순 string class의 함수를 사용하는것이라 시간만 검증해보면 됐다.
입력된 문자열의 최대 길이는 1000이다.
사용한 string class의 함수를 보면 최대 O(n)으로 짐작할 수 있으므로
시간은 충분하다고 생각하고 구현했다.
||오답 원인
개~~~~~멍청하게 이거 하나때문에 30분을 날려먹었다.
다음엔 이런 실수는 하지 말자ㅠㅠ
||구현
#include <bits/stdc++.h>
using namespace std;
bool myUnique(const int & a, const int & b)
{
if (a == '.') return a == b;
return false;
}
string solution(string new_id) {
string answer = "";
for (auto & d : new_id)
{
if ('A' <= d && d <= 'Z')
answer += tolower(d);
else if (d == '-' || d == '_' || d == '.' || ('0' <= d && d <= '9') || ('a' <= d && d <= 'z'))
answer += d;
}
answer.erase(unique(answer.begin(), answer.end(), myUnique), answer.end());
if (answer.front() == '.') answer.erase(answer.begin());
if (answer.back() == '.') answer.pop_back();
if (answer.size() == 0) answer = "a";
if (16 <= answer.size()) answer.resize(15);
if (answer.back() == '.') answer.erase(answer.end() - 1);
while (answer.size() <= 2) answer += answer.back();
return answer;
}
||되돌아보기
단순 string class의 함수를 다룰줄 알아? 라는 문제였던것같다.
1단계지만 40분이나 걸려서 더 열심히 공부해야겠다는 생각이 든다😪
||개선 코드
for(auto & d : new_id)
{
if('A' <= d && d <= 'Z')
answer += tolower(d);
//내 코드/////////////////////////////////////////////////////////////////////
else if(d == '-'|| d == '_' || d == '.' || ('0' <= d && d <= '9') || ('a' <= d && d <= 'z'))
answer += d;
//다른 분의 개선코드//////////////////////////////////////////////////////////
else if(strchr("-_.",d) ||('0' <= d && d <= '9') || ('a' <= d && d <= 'z'))
answer += d;
}
저 한부분을 좀 편하게 사용할 수 있는 방법이 있었는데
strchr이란 함수를 사용하는 것!
문자열안에 문자가 있으면 문자의 포인터를, 없으면 null을 반환한다.
훨씬 깔끔하고 보기 좋다ㅎㅎ
'코딩 테스트 > 알고리즘 풀이' 카테고리의 다른 글
[백준 - 1560] 비숍 (0) | 2022.12.03 |
---|---|
[알고스팟 - PICNIC] 소풍 (0) | 2022.12.02 |
[백준 - 2437] 저울 (0) | 2022.09.07 |
[프로그래머스] 신고 결과 받기 (0) | 2022.09.03 |
[프로그래머스] 숫자 문자열과 영단어 (0) | 2022.09.02 |