2021 카카오 코딩 테스트 문제입니다.
문제 확인
코딩 테스트에 단골 문제인 문자열 처리 문제입니다.
모든 테스트 케이스에서 최대 0.02ms 정도 빠른 시간을 받기 위해 한 번의 루프로 처리를 해 줍니다.
풀이
객체 처리는 일반 char 배열에 비하여 느리므로 char와 인덱싱을 통해 풀어줍니다.
좀 더 빠른 실행을 위해 7단계를 3단계로 합칩니다.
1, 2, 3, 6 단계와 4단계 일부분을 처음 문자열 탐색에 모두 마치고 4단계를 한번 더 검증한 후 5, 6, 7 단계를 처리합니다.
- 처음 루프로 진입하기 전 . 외에 문자가 나올 때까지 인덱스를 넘겨줍니다. 그 후 1, 2 단계를 루프를 돌면서 처리해줍니다. bool 변수를 통해 이전에 받은 . 문자를 처리해 전 문자가 . 일 경우 다음 . 문자를 받지 않도록 해 3단계를 처리합니다. 루프는 조건에 맞는 문자가 들어오는 경우만 세어 15개의 문자 까지만 받아 6단계를 처리합니다.
- 한 번의 루프가 끝나면 빈 문자열인 경우 "aaa"를 즉시 반환해주고, 아니라면 끝에 나오는 . 문자를 처리해줍니다. 루프를 돌면서 중첩된 . 문자는 모두 처리하였으므로 하나의 . 만 처리해주면 됩니다.
- 마지막으로 문자열의 크기가 2 이하인 경우를 처리해줍니다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#include <string>
#include <vector>
using namespace std;
string solution(string new_id) {
char answer[16];
int i = 0, cur = 0;//i : new_id 인덱스, cur : answer 인덱스 -> 6단계 처리
bool p = 1;//3단계 처리를 위한 변수
while (new_id[i] == '.')i++;//처음 나오는 . 들을 처리
for (; i < new_id.size() && cur<15;i++) {
if (isupper(new_id[i]))//1단계 대문자 처리
answer[cur++] = (new_id[i] - 'A' + 'a'), p = false;
else if (isalnum(new_id[i]) || new_id[i] == '-' || new_id[i] == '_')//2단계 처리
answer[cur++] = (new_id[i]), p = false;
else if (new_id[i] == '.' && !p) //4단계 처리
answer[cur++] = (new_id[i]), p = true;
}
if (!cur) return "aaa";//5단계 처리
else if (answer[cur - 1] == '.')//4단계 . 처리
answer[cur - 1] = '\0', cur -= 1;
else answer[cur] = '\0';
if (cur < 3) {//7단계
while (cur != 3) {
answer[cur] = answer[cur - 1];
cur++;
}
answer[3] = '\0';
}
return answer;
}
|
cs |
반응형
'알고리즘 문제 > [프로그래머스]' 카테고리의 다른 글
[프로그래머스] 순위 검색 (0) | 2021.02.07 |
---|---|
[프로그래머스] 메뉴 리뉴얼 (0) | 2021.02.03 |
[프로그래머스] 보석 쇼핑 (0) | 2021.01.15 |
[프로그래머스] 스타 수열 (0) | 2020.12.31 |
[프로그래머스] 4단 고음 (0) | 2020.12.04 |