반응형
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

출처는 프로그래머스이다.

문제는 다음 링크를 타고 들어가면 확인할 수 있다. ( programmers.co.kr/learn/courses/30/lessons/42889 )

 

 

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
/*
N    stages    result
5    [2, 1, 2, 6, 2, 4, 3, 3]    [3,4,2,1,5]
4    [4,4,4,4,4]    [4,1,2,3]
*/
 
bool CmpPair(const pair<intdouble>& i, const pair<intdouble>& j)
{
    if(i.second == j.second)
        return i.first < j.first;
    return i.second > j.second;
}
 
vector<int> solution(int N, vector<int> stages) {
    vector<int> answer;
    vector<int> stage_fcnt; 
    // 각 스테이지 별로 몇 명 통과했는지를 기록 | [0]은 1번 스테이지, [1]은 2번 스테이지 ...
    vector<pair<intdouble>> failpair;
    // 각 스테이지 별 실패율이 어떤 지를 확인.
    // 이렇게 묶어두면 정렬하기가 매우 편리하다.
    
    // 스테이지의 갯수만큼 벡터 요소들 추가한다.
    for(int i=0; i<N; i++)
        stage_fcnt.push_back(0);
    
    // 각 스테이지 별로 몇 명 묶여 있는지 파악.
    for(vector<int>::iterator it=stages.begin(); it!=stages.end(); it++)
        if(*it < N+1// 1부터 N 스테이지의 실패율만 알면 되기 때문에.
            stage_fcnt[*it-1]++;
    
    // 각 스테이지 별 실패율을 구한다.
    for(int i=0, now_cnt=stages.size(); i<stage_fcnt.size(); i++)
    {
        if(stage_fcnt[i] == 0// 스테이지를 아무도 묶여 있지 않다면
            failpair.push_back(make_pair(i+10)); // 그냥 0 처리하며 now_cnt는 줄이지 않는다!!
        else 
        {
            failpair.push_back(make_pair(i+1, (double)stage_fcnt[i] / (double)now_cnt));
            now_cnt-=stage_fcnt[i];        
        }
                               
    }
 
    // 정렬을 하되 CmpPair 조건에 맞도록 정렬한다.
    sort(failpair.begin(), failpair.end(), CmpPair);
    
    // 실패율을 기준으로 pair를 정렬했으니 pair 중 stage에 해당하는 값만 answer에 저장.
    for(vector<pair<intdouble>>::iterator it=failpair.begin(); it != failpair.end(); it++)
        answer.push_back(it->first);
    
    return answer;
}
cs
728x90
반응형
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

모든 문제의 출처는 프로그래머스이다.

문제는 다음과 같다.

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요. divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

 

[ C++ 풀이 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
vector<int> solution(vector<int> arr, int divisor) {
    vector<int> answer;
    
    for(auto i : arr) // 벡터의 모든 요소를 순회하면서
        if(i%divisor == 0// 나누어 떨어지면
            answer.push_back(i); // answer 벡터에 추가
    
    if(answer.empty()) // 모든 요소를 돌았음에도 answer가 비었다면
        answer.push_back(-1); // -1 값 대입
    else // answer에 값이 들어있다면 정렬!
        sort(answer.begin(), answer.end()); // 기본은 오름차순
    
    return answer;
}
cs

 

[ Python 풀이 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def solution(arr, divisor):
    
    answer = [] # 빈 리스트 생성.
    
    for i in arr: # arr 내 요소를 순회
        if i%divisor == 0# 나누어 떨어진다면
            answer.append(i) # 해당 요소를 answer 리스트에 추가
            
    if not answer: # 리스트가 비어있다면(리스트가 비면 거짓, 들어있으면 참)
        answer.append(-1# -1 추가
    else# 리스트가 비어있지 않다면
        answer.sort() # 기본 오름차순으로 정렬.
     
    return answer
 
 
# 아래와 같이 한 줄로도 처리가 가능하다.
# sort는 리스트의 내장 함수이며, 원본 리스트 내의 순서를 변경한다
# sorted는 일반 내장 함수로 원본 리스트를 변경하지 않고, 새롭게 정렬된 리스트를 반환한다.
def solution(arr, divisor):
    return sorted([i for i in arr if i%divisor == 0]) or [-1]
 
 
cs

 

sort와 sorted 정리해본 것 같은데, 그냥 나올 때 마다 정리하겠다.

C++ 에서도 Python 에서도 딱히 어려운 부분은 없기 때문에 그냥 마무리한다.

728x90
반응형
728x90
반응형

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

모든 문제 출처는 위의 프로그래머스다 ㅋ

문제 설명

스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.

이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.
맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.

  1. 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
  2. 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
  3. 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
  4. 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
    4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.

순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.

[제한사항]

  • numbers 배열의 크기는 1 이상 1,000 이하입니다.
  • numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.
  • hand는 "left" 또는 "right" 입니다.
    • "left"는 왼손잡이, "right"는 오른손잡이를 의미합니다.
  • 왼손 엄지손가락을 사용한 경우는 L, 오른손 엄지손가락을 사용한 경우는 R을 순서대로 이어붙여 문자열 형태로 return 해주세요.

[ C++ ]

 

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
string solution(vector<int> numbers, string hand) {
    string answer = "";
    
    vector<int> left_numbers({ 147-1 }); // 왼쪽 사이드 버튼들로 여기 버튼들은 무조건 왼손으로만 누른다.
    vector<int> right_numbers({ 369-2 }); // 오른쪽 사이트 버튼들로 여기 버튼들은 무조건 오른손으로만 누른다.
    vector<int> mid_numbers({ 2580 }); // 가운데 사이드 버튼들로 누르기 위해 거리를 계산해야하는 버튼들.
    
    int last_left_finger = -1, last_right_finger = -2// 직전에 각 손이 누른 번호를 기록. -> 직전 버튼과 현재 버튼 사이에 거리를 구해야하기 때문
    bool last_left_flag = true, last_right_flag = true
    // 각손의 직전에 누른 버튼이 각 사이드를 눌렀는지 여부. -> 사이드를 눌렀을 때와 가운데 사이드를 눌렀을 때의 거리 계산이 다르기 때문에 식별해야함.
    int left_distance = 0, right_distance = 0// 왼손과의 거리, 오른손과의 거리
 
    for(auto now_number : numbers) // 누른 번호들을 하나씩 순회하면서
    {
        if(find(left_numbers.begin(), left_numbers.end(), now_number) != left_numbers.end()) // 왼쪽 사이드에 있는 번호라면
        {
            answer += "L"// 답을 작성
            last_left_finger = now_number; // 직전 누른 번호를 갱신
            last_left_flag = true// 사이드 번호를 눌렀으니 true로 갱신
        }
        else if(find(right_numbers.begin(), right_numbers.end(), now_number) != right_numbers.end())
        {
            answer += "R"// 답을 작성
            last_right_finger = now_number; // 직전 누른 번호를 갱신
            last_right_flag = true// 사이드 번호를 눌렀으니 true로 갱신
        }
        else // 만약에 현재 누른 버튼이 가운데 사이드라면 직전에 눌린 
        {
            if(last_left_flag == false// 왼손이 마지막으로 눌렀던 번호가 가운데 사이드의 버튼을 눌렀다면 
            { // 단순 인덱스 차 계산을 진행한다.
                left_distance = find(mid_numbers.begin(), mid_numbers.end(), last_left_finger) - find(mid_numbers.begin(), mid_numbers.end(), now_number);
                left_distance = (left_distance<0)? left_distance * -1 : left_distance;
            }
            if(last_right_flag == false// 오른손이 마지막으로 눌렀던 번호가 가운데 사이드의 버튼을 눌렀다면 
            { // 단순 인덱스 차 계산을 진행한다.
                right_distance = find(mid_numbers.begin(), mid_numbers.end(), last_right_finger) - find(mid_numbers.begin(), mid_numbers.end(), now_number);
                right_distance = (right_distance<0)? right_distance * -1 : right_distance;
            }
            if(last_left_flag == true// 왼손이 마지막으로 눌렀던 번호가 왼쪽 사이드의 버튼을 눌렀다면 
            {  // 현재 눌린 번호로부터 왼쪽 손의 왼쪽 사이드에서 직전에 누른 번호까지 거리를 구한다.
                int idx = find(left_numbers.begin(), left_numbers.end(), last_left_finger) - left_numbers.begin();
                for(int i=0; i<mid_numbers.size(); i++)
                    if( mid_numbers[i] == now_number )
                        left_distance = (idx - i < 0)? i-idx+1 : idx-i+1;
            }
            if(last_right_flag == true// 오른손이 마지막으로 눌렀던 번호가 오른쪽 사이드의 버튼을 눌렀다면 
            { // 현재 눌린 번호로부터 오른쪽 손의 오른쪽 사이드에서 직전에 누른 번호까지 거리를 구한다.
                int idx = find(right_numbers.begin(), right_numbers.end(), last_right_finger) - right_numbers.begin();
                for(int i=0; i<mid_numbers.size(); i++)
                    if( mid_numbers[i] == now_number )
                        right_distance = (idx - i < 0)? i-idx+1 : idx-i+1;
            }
 
            // 아래부터는 거리를 계산하여 가까운 쪽 손으로 처리를 하되, 거리가 같은 경우에는 main손?으로 처리한다.
            if(left_distance < right_distance)
            {
                last_left_flag = false;
                last_left_finger = now_number;
                answer += "L";
            }
            else if(left_distance > right_distance)
            {
                last_right_flag = false;
                last_right_finger = now_number;
                answer += "R";
            }
            else if(left_distance == right_distance)
            {
                if(hand == "left")
                {
                    last_left_flag = false;
                    last_left_finger = now_number;
                    answer += "L";
                }
                else if(hand == "right")
                {
                    last_right_flag = false;
                    last_right_finger = now_number;
                    answer += "R";
                }
            }
        }
    }
    return answer;
}
cs

[ Python ]

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
37
38
39
40
41
42
43
44
45
46
47
48
49
def solution(numbers, hand):
    answer = ''
    
    left_side = [ 147-1 ]
    right_side = [ 369-2 ]
    mid_side = [ 2580 ]
    
    last_left_val = -1
    last_right_val = -2
    
    for i in numbers:
        
        if i in left_side: # i가 왼쪽 사이드인 경우 -> 왼손으로 그냥 누르면 됨.
            answer += 'L' 
            last_left_val = i
        elif i in right_side: # i가 오른쪽 사이드인 경우 -> 오른손으로 그냥 누르면 됨.
            answer += 'R'
            last_right_val = i
        else# i가 가운데 사이드인 경우 -> 경우마다 거리를 계산해야 함.
            if last_left_val in mid_side: # 왼손 마지막이 가운데 줄에 있으면 -> 단순 계산
                left_dist = mid_side.index(i) - mid_side.index(last_left_val)
                left_dist = (lambda n: n*-1 if n<0 else n)(left_dist)
            
            if last_right_val in mid_side: # 오른손 마지막이 가운데 줄에 있으면 -> 단순 계산
                right_dist = mid_side.index(i) - mid_side.index(last_right_val)
                right_dist = (lambda n: n*-1 if n<0 else n)(right_dist)
            
            if last_left_val in left_side: # 왼손 마지막이 왼쪽 줄에 있으면 -> 거리 구함
                left_dist = abs(left_side.index(last_left_val) - mid_side.index(i)) + 1
            
            if last_right_val in right_side: # 오른손 마지막이 오른쪽 줄에 있으면 -> 거리 구함
                right_dist = abs(right_side.index(last_right_val) - mid_side.index(i)) + 1
                
            # 거리 비교 후, 처리
            if left_dist < right_dist:
                answer += 'L'
                last_left_val = i
            elif left_dist > right_dist:
                answer += 'R'
                last_right_val = i
            else:
                if hand == "left":
                    answer += 'L'
                    last_left_val = i
                elif hand == "right":
                    answer += 'R'
                    last_right_val = i
    
    return answer
cs

 

같은 논리로 작성된 코드인데 파이썬이 압도적으로 짧다..

C++에서는 find 함수의 사용법이나 활용법, 차이를 통해 인덱스 차이를 구할수 있는 부분 등을 확인하면 되고, Python에서는 index 함수(없을 경우에는 에러가 나기 때문에 확실히 존재하는 값일 경우 인덱스를 구하기 위해 사용), in 절, 람다 함수, abs 함수 사용법을 보고 넘어가면 될 것이다.

728x90
반응형
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

모든 문제의 출처는 위임을 밝힘ㅋ

[ C++ ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <string>
#include <vector>
 
using namespace std;
 
string solution(int a, int b) {
    string answer = "";
    
    int month[12= { 312931303130313130313031 };
    string day_string[7= { "FRI""SAT""SUN""MON""TUE""WED""THU" };
    int sumday = 0// 2016년 1월 1일부터 ~ 2016년 a월 b일까지 총 날짜 수를 구함.
    
    for(int i=1; i<a; i++)
        sumday += month[i-1]; // a월 직전 달까지 모든 날짜를 더한 후
    sumday += (b-1); // a월의 b일까지 더하고 1일부터 시작하니 1일을 뺀다.
    
    return day_string[sumday%7];
}
cs

[ Python ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def solution(a, b):
    answer = ''
    month = [ 312931303130313130313031 ]
    day_string = [ "SUN""MON""TUE""WED""THU""FRI""SAT" ]
    sumday = 0
    
    for i in range(1, a):
        sumday += month[i-1]
    sumday = sumday + (b-1)
    
    return day_string[(sumday+5)%7]
    
    # 아래 한 줄로 7번 라인 ~ 11번 라인을 대체할 수 있다.
    # return day_string[(sum(month[:a-1-1])+b-1+5)%7] 
    # 위의 내용들과 같다.
cs
728x90
반응형
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

모든 출처는 위 사이트이다 ㅋㅋ

어렵게 꼬은 문제일 줄 알았는데 아주 아주 간단한 문제였다.

[C++]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
#include <string>
#include <vector>
 
using namespace std;
 
long long solution(int a, int b) {
    long long answer = 0;
    long long tmp = a;
    
    if(a>b) // a가 b보다 큰 경우, 예를 들면 a=6, b=3 -> 이 경우는 swap
    {
        a = b;
        b = tmp;
    }
    
    for(;a<=b;a++)
        answer += a;
    
    return answer;
}
cs

[Python]

1
2
3
4
5
6
7
8
9
10
11
def solution(a, b):
    answer = 0
    if b<a:
        tmp = a
        a = b
        b = tmp
    
    for i in range(a, b+1):
        answer = answer + i
    
    return answer
cs
728x90
반응형
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

모든 문제의 출처는 위다ㅋ

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.

전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 전체 학생의 수는 2명 이상 30명 이하입니다.
  • 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
  • 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

입출력 예

n                                              lost                              reserve                               return

5 [2, 4] [1, 3, 5] 5
5 [2, 4] [3] 4
3 [3] [1] 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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    vector<int> cls;
    vector<int>::iterator it;
    
    // 먼저, 전체 인원에 대한 벡터를 생성
    for(int i=0; i<n; i++)
        cls.push_back(i+1);
    
    // 체육복 안 가져온 애들을 일단 제외함
    for(int i=0; i<lost.size(); i++)
    {
        for(int j=0; j<cls.size(); j++)
        {
            if(cls[j] == lost[i])
            {
                if((it = find(reserve.begin(), reserve.end(), lost[i])) != reserve.end())
                { // 체육복을 가져왔는데, 도난 당한 애들을 먼저 솎아 낸다.
                    reserve.erase(it); // 본인 것을 입으므로 여벌에서 지우고,
                    lost.erase(lost.begin()+i); // 여벌로 충당했으니 잃어버린 사실도 없음.
                    i--// lost 목록에서 지웠으니 i를 감소시켜야함.
                }
                else // 체육복을 일단 안 가져왔으므로 제거.
                    cls.erase(cls.begin()+j);
                break;
            }
        }
    }
    
    
    
    
    // 체육복을 안 가져온 애들을 기준으로 양 옆에 체육복을 빌리는 작업을 진행
    
    for(int i=0; i<lost.size(); i++)
    {
        if((it = find(reserve.begin(), reserve.end(), lost[i]-1)) != reserve.end())
        {
            reserve.erase(it);
            cls.push_back(lost[i]);
        }
        else if((it = find(reserve.begin(), reserve.end(), lost[i]+1)) != reserve.end())
        {
            reserve.erase(it);
            cls.push_back(lost[i]);
        }
    }
    
    answer = cls.size();
    
    return answer;
}
cs

 

728x90
반응형
728x90
반응형
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

출처임.

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
#include <string>
#include <vector>
#include <cctype>
 
using namespace std;
 
string solution(string new_id) {
    string answer = "";
 
    // - 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
    for(char& ch : new_id)
        ch = std::tolower(ch); // 대문자를 받으면 소문자로 변환 후 리턴!
    std::cout<<"1단계]"<<new_id<<std::endl;    
    
    // - 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
    for(char& ch : new_id)
        if((ch >= 'a' && ch <= 'z'|| (ch >= '0' && ch <= '9'|| ch == '-' || ch == '_' || ch == '.' )
            answer.push_back(ch); // 위 조건에 해당되는 문자들만 넣어서 재구성함.
    std::cout<<"2단계]"<<answer<<std::endl;    
    
    // - 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
    bool prev_dot_flag = false// 이전에 .이 나왔었는지 확인하는 flag -> .이 나오면 일반 문자가 나올 때까지 true 상태.
    new_id = answer; // 갱신
    answer.clear();
    
    for(char& ch : new_id)
    {
        if(ch == '.'// . 이 나오면 연속적으로 .인지, 첫 .인지 확인 후, 첫 점이면 대입하고 이후 나오는 점이면 무시함.
        {
            if(prev_dot_flag == false)
            {
                answer.push_back(ch);
                prev_dot_flag = true;
            }
            continue;
        }
        answer.push_back(ch);
        prev_dot_flag = false;
    }
    std::cout<<"3단계]"<<answer<<std::endl;  
    
    // - 4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
    
    if(answer.front() == '.'// 처음이 점이면
        answer.erase(0,1);
    
    if(answer.back() == '.'// 끝이 점이면
        answer.erase(answer.size()-1,1);
    std::cout<<"4단계]"<<answer<<std::endl;
    
    // - 5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
    if(answer.empty())
        answer.push_back('a');
    std::cout<<"5단계]"<<answer<<std::endl;
    
    // - 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
    //        만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
    if(answer.size() >= 16)
    {
        if(answer.at(14== '.')
            answer = answer.substr(014);
        else
            answer = answer.substr(015);
    } // 그냥 15개를 자르고 마지막 answer.back() == '.' 이면 pop_back() 이렇게 처리해도 된다.
    std::cout<<"6단계]"<<answer<<std::endl;
    
    // - 7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
    if(answer.size() <= 2)
        while(answer.size() <= 2)
            answer.push_back(answer.back()); // answer += answer.back(); 이렇게도 가능하다.
    std::cout<<"7단계]"<<answer<<std::endl;
    
    return answer;
}
cs

 

728x90
반응형

+ Recent posts