알고리즘 문제/[프로그래머스]

[프로그래머스] 신규 아이디 추천

latter2005 2021. 2. 2. 21:34

2021 카카오 코딩 테스트 문제입니다.

 

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 카카오계정개발팀에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. 네오에게 주어진 첫 업무는 새로 가

programmers.co.kr

문제 확인

 

코딩 테스트에 단골 문제인 문자열 처리 문제입니다.

모든 테스트 케이스에서 최대 0.02ms 정도 빠른 시간을 받기 위해 한 번의 루프로 처리를 해 줍니다.

 

풀이

 

객체 처리는 일반 char 배열에 비하여 느리므로 char와 인덱싱을 통해 풀어줍니다.

좀 더 빠른 실행을 위해 7단계를 3단계로 합칩니다.

1, 2, 3, 6 단계와 4단계 일부분을 처음 문자열 탐색에 모두 마치고 4단계를 한번 더 검증한 후 5, 6, 7 단계를 처리합니다.

  1. 처음 루프로 진입하기 전 . 외에 문자가 나올 때까지 인덱스를 넘겨줍니다. 그 후 1, 2 단계를 루프를 돌면서 처리해줍니다. bool 변수를 통해 이전에 받은 . 문자를 처리해 전 문자가 . 일 경우 다음 . 문자를 받지 않도록 해 3단계를 처리합니다. 루프는 조건에 맞는 문자가 들어오는 경우만 세어 15개의 문자 까지만 받아 6단계를 처리합니다.
  2. 한 번의 루프가 끝나면 빈 문자열인 경우 "aaa"를 즉시 반환해주고, 아니라면 끝에 나오는 . 문자를 처리해줍니다. 루프를 돌면서 중첩된 . 문자는 모두 처리하였으므로 하나의 . 만 처리해주면 됩니다.
  3. 마지막으로 문자열의 크기가 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
반응형