string.find()함수는 찾는 문자열의 위치를 반환한다

 

만약 문자열에 없는 문자를 찾을경우 

string::npos를 리턴한다

그러므로 사용할때 npos가 리턴되면 없는문자이므로 사용할시에

 

npos?

npos 검색 함수가 실패할 때 "찾을 수 없음" 또는 "모든 나머지 문자"를 나타내는-1로 초기화 된 부호 없는 정수 값입니다.

 

문자열에 없는 문자열이 들어갈 경우가 있을경우를 생각해서 예외처리를 해줘야한다.

 

 

 

참조:

https://docs.microsoft.com/ko-kr/cpp/standard-library/basic-string-class?view=vs-2019#find

'c , c++ , c# 이론정리' 카테고리의 다른 글

박싱과 언박싱  (0) 2020.01.30
C/C++/C# 정리및 차이점  (0) 2020.01.20
  • 큰 수 만들기
  • darklight

    sublimevimemacs

    C++ 

문제 설명

어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.

예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.

문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.

제한 조건

  • number는 1자리 이상, 1,000,000자리 이하인 숫자입니다.
  • k는 1 이상 number의 자릿수 미만인 자연수입니다.

입출력 예

numberkreturn

1924 2 94
1231234 3 3234
4177252841 4 775841

 

풀이 ) 맨처음에는 정렬 하면 되지않나 싶었는데 

예제 3 .을 보면 글자의 순서는 바뀌지 않다는것 1429 엿다고 94가 최고숫자가 아님 429 이면 49가 제일 큰숫자라는게 있었다.

그래서 while 문 조건(범위,중복)만 잘맞춰주면 완성되는 문제 인거같다고 생각하게 되었다.

 

 

 

 

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
93
94
95
96
 
int main()
{
    string number = "4177252841";
    int k = 4;
    
    //글자의 순서는 바뀌지 않음
    //1429 엿다고 94가 최고숫자가 아님
    //1429 이면 49가 제일 큰숫자
 
    int Itemp =0;
    
    
    
    int Nsize = number.size() - k;
    int index = 0;
    string answer = "";
    int cylcle = 0;
    while (answer.size() !=Nsize)
    {
        index = 0;
        Itemp = 0;
        if (cylcle == 0)
        {
            for (int i = 0; i < number.size() - Nsize + 1; i++//k개의 숫자를 잘라서 만드는게 길이이고 0부터 시작하므로 +1까지
            {
                if (Itemp == 0)  //처음이면 0이니까 넣어준다
                {
                    Itemp = number.at(i) - '0';
                    index = i;
                    cout << Itemp << endl;
                }
                else if (Itemp >= number.at(i) - '0'// 더크거나 같으면 앞에꺼를 넣어주고
                {
                    continue;
                }
                else
                {
                    Itemp = number.at(i) - '0';  //i번쨰가 크다면 i숫자를 기억하고 위치기억
                    index = i;
 
                }
            }
        }
 
        
        else
        {
            for (int i = 0+cylcle; i < number.size() +answer.size() -Nsize+1; i++//돌면서 기억한 위치뒤를확인하는데 범위가 넘어가지않게
            {
                cout << number.at(i) << " ";
                if (Itemp == 0)
                {
                    Itemp = number.at(i) - '0';
                    index = i;
                    cout << Itemp << endl;
                }
                else if (Itemp >= number.at(i) - '0')
                {
                    continue;
                }
                else
                {
                    Itemp = number.at(i) - '0';
                    index = i;
 
                }
            }
        }
        answer += number.at(index); //위치기억한곳에 넣어주자
        
        cylcle += index+1 -cylcle; //for문을 위한 위치기억
        cout << index << "번쨰" << Itemp << endl//테스트위함
        
    }
 
 
    cout << answer; //답
 
 
    
    
    
 
    
    
 
    
    
 
 
    return 0;
 
 
}
 
cs

 

 

  • 소수 찾기
  • darklight

    sublimevimemacs

    C++ 

문제 설명

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.

각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.

제한사항

  • numbers는 길이 1 이상 7 이하인 문자열입니다.
  • numbers는 0~9까지 숫자만으로 이루어져 있습니다.
  • 013은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.

입출력 예

numbersreturn

17 3
011 2

입출력 예 설명

예제 #1
[1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.

예제 #2
[0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.

  • 11과 011은 같은 숫자로 취급합니다.

 

 

풀이) 일단 문자열을 정렬해서 제일큰수까지 에라스토테네스의 체를 이용한 소수를 찾아준다

       그뒤에는 저수들을 어떤식으로  17이 주어지면 1,7,17,71을 보내서 찾을수가 있을까 하다가 

next_permutation , prev_permutation  이라는 순열 정렬 함수를 찾게 되어서 풀게되었고

중간에 소수를 찾은뒤 소수에서 만약 17이 주어지면 1 , 7 이 들어가기만해도  2라고 수를 바꾸어준뒤에

그뒤에 sub_str을 이용해서 하나씩 2인지 아닌지 체크해주니 할수있었다.

중간에 signal: segmentation fault (core dumped) 가 뜨는문제가 있었는데  

처음에는 무엇이 벗어나는것일까 하고 for문을 보다가 문제가 없는거같아서.
int number[10000000]; 의 범위를 더크게해주었더니 되었다 

 

  


int number[10000000];

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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
int main()
{
    string numbers = "25489";
    
    vector<int>ab;
 
    
    int n = 0;
    int nn = 0;
    
    sort(numbers.begin(), numbers.end(),greater<int>() );
 
    nn = stoi(numbers);
 
    int answer = 0;
 
    for (int i = 0; i < numbers.size(); i++)
    {
        ab.push_back(numbers[i] - '0');
    }
 
    for (int i = 2; i <= nn; i++)
    {
        if (number[i] == 1)
        {
            continue;
        }
        for (int j = i * 2; j <= nn; j += i)
        {
            number[j] = 1;
        }
 
    }
 
    
 
    for (int i = 2; i <= nn; i++)
    {
        if (number[i] == 0)
        {
            int temp = i;
            
            while (temp !=0)
            {
 
                for (int j = 0; j < ab.size(); j++)
                {
                    if (temp == ab.at(j))
                    {
                        number[i] = 2//하나라도 들어가있으면 체크
                        
                    }
                    
                }
 
                temp /= 10;
            }
            
        }
 
    }
 
 
    do {
        for (int j = 0; j <= ab.size(); j++)
        {
            string temp;
            int b=0;
            
            temp = numbers.substr(0, j + 1);
            
            
            if (number[b] == 2)
            {
 
 
                answer += 1;
                number[b] = 0;
 
            }
 
 
        }
                for (int j = 0; j <= ab.size(); j++)
                {
                    string temp = numbers.substr(0, j+1);
                    int b = stoi(temp);
 
                    if (number[b] == 2)
                    {
                        
                            
                            answer += 1;
                            number[b] = 0;
                            
                    }
 
 
                }
 
 
 
            
 
        
    }
    while (prev_permutation(numbers.begin(), numbers.end()));
 
    
 
    
    
 
 
    return 0;
 
 
}
cs

 

 

  • 최대공약수와 최소공배수
  • darklight

    sublimevimemacs

    C++ 

문제 설명

두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.

제한 사항

  • 두 수는 1이상 1000000이하의 자연수입니다.

입출력 예

nmreturn

3 12 [3, 12]
2 5 [1, 10]

입출력 예 설명

입출력 예 #1
위의 설명과 같습니다.

입출력 예 #2
자연수 2와 5의 최대공약수는 1, 최소공배수는 10이므로 [1, 10]을 리턴해야 합니다.

 

 

풀이) 최대 공약수는 약수를 찾는데 가장큰 겹치는 수를  리턴한다

3 = 1 3;

12 = 1 2 3 4  6 12;

-> 1 -> 3  3리턴

 

최소 공배수는 풀이가 생각이 나지않아서 두수의 배수를 비교해서 같아지는 수를 리턴해주었다.

 

이보다 최소공배수를 구하는것에 더쉬운것이 있을거같긴한데   

어마어마한큰수를 만약 구한다면 다른 방법을 생각해야할듯싶다.

 

 

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
 
int main()
{
    int n = 60;
    int m =48 ;
    int nn =n;
    int mm =m;
    //1, 2
    //1 ,5
    
 
 
    vector<int>answer;
    
    vector<int>a;
    
 
    while (true)
    {
        for (int i = 1; i <= m; i++)
        {
            if (m % i == 0)
            {
                a.push_back(i);
            
            }
            
 
        }
        
        for (int i = 1;i <= n; i++)
        {
            if (n%i == 0)
            {
                a.push_back(i);
            
            }
        }
 
        break;
 
 
    }
 
 
    sort(a.begin() ,a.end());
    int lower = 0;
    for (int i = 0; i < a.size(); i++)
    {
        if (i + 1 < a.size())
        {
            if (a.at(i) == a.at(i + 1))
            {
                lower = a.at(i);
                a.erase(a.begin() + i);
                
                i = -1;
            }
        }
 
    }
    answer.push_back(lower);
    
 
    while (true)
    {
        
        if (n == m)
        {
            cout << n;
            answer.push_back(n);
            break;
        }
        else
        {
            if (n < m)
            {
                n += nn;
 
            }
            else
            {
                m += mm;
            }
        }
 
 
    }
 
cs

 

에라토스테네스의 체

[ Eratosthenes' sieve ]

요약 그리스의 수학자이자 지리학자인 에라토스테네스가 고안한 소수()를 찾는 방법으로, 이 방법으로 소수를 찾으려면, 2부터 시작해 자연수를 차례로 쓴 다음, 2 이외의 2의 배수, 3 이외의 3의 배수, 5 이외의 5의 배수의 순서로 수를 지워나가 끝에 남는 수가 소수이다.

2부터 n까지의 숫자중에서 에라토스테네스의 체로 소수를 찾으려면, 2부터 시작해 n까지의 자연수를 차례로 쓴다. (2, 3, 4, ..., n)
그리고 2 이외의 2의 배수를 지운다(p=2). 이때 2가 최초의 소수가 된다.
그 다음 소수인 3을 제외한 3의 배수를 지운다(p=3).
이 방법을 다음에 지울 소수, 즉 p의 제곱이 n 보다 커질 때까지, 이 방법을 계속한다(p2≥n).

그러면 체로 친 것처럼 끝에 남는 수가 있다. 이 수가 바로 그 자신과 1 이외의 다른 수로는 나누어 떨어지지 않는 소수이고, 이렇게 소수를 찾는 방법을 에라토스테네스의 체라고 한다. 이 과정은 끝없이 계속되지만 20까지 자연수를 지워나가도 소수가 2, 3, 5, 7, 11, 13, 17, 19임을 쉽게 알 수 있다.

출처 :[네이버 지식백과] 에라토스테네스의 체 [Eratosthenes' sieve] (두산백과)

 

 

 

 

 

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
int number[100000];
 
int main()
{
    int n = 100;
    int answer=0;
 
 
    //2부터 시작해 자연수를 쓴다음 
    for (int i = 2; i <= n; i++)
    {
        if (number[i] == 1)
        {
            continue;  //i가 이미 체크된곳이라면 지나가
        }
        for (int j = i * 2; j <= n; j+=i)
        {
            number[j] = 1;   //i이외의 배수를 지운다
        }
    }
 
    for (int i = 2; i <= n; i++)
    {
        if (number[i] == 0)
        {
            cout << i<<endl;
        
        }
    }
 
 
    return 0;
 
 
}
cs

 

 

  • 시저 암호
  • darklight

    sublimevimemacs

    C++ 

문제 설명

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 AB는 1만큼 밀면 BC가 되고, 3만큼 밀면 DE가 됩니다. z는 1만큼 밀면 a가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.

제한 조건

  • 공백은 아무리 밀어도 공백입니다.
  • s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
  • s의 길이는 8000이하입니다.
  • n은 1 이상, 25이하인 자연수입니다.

입출력 예

snresult

AB 1 BC
z 1 a
a B z 4 e F d

 

 

풀이)  아스키 코드를 보면 쉽게 알수있다  , 공백과 특수문자에 주의하면 쉬운문제

 

 

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
    string s;
    int n = 25;
    s = "a B z";
    vector<int>ab;
    for (int i = 0; i < s.length(); i++)
    {
        if (s.at(i) != ' '//공백인가 아닌가 체크
        {
            if (s.at(i) >= 97// 소문자라면
            {
                if (s.at(i) + n <= 122)
                {
                    ab.push_back(s.at(i) + n);
 
                }
                else
                {
                    ab.push_back(s.at(i) + n - 26);
                }
            }
            else
            {
                if (s.at(i) + n <= 90)  //대문자라면
                {
                    ab.push_back(s.at(i) + n);
 
                }
                else
                {
                    ab.push_back(s.at(i) + n - 26);
                }
            }
        }
        else
        {
            ab.push_back(s.at(i));
        }
    }
    string answer;
 
    for (int i = 0; i < ab.size(); i++)
    {
        answer += char(ab.at(i));  //char형으로 바꾸어서 입력 아스키코드를
    }
    
    for (int i = 0; i < answer.length(); i++)
    {
        cout << answer.at(i);
    }
cs

 

 

 

+ Recent posts