문자열(String)

--·2022년 6월 1일
0

문자열

Silver 11720

첫시도

#include <iostream>
using namespace std;


int main() {
	int n, k, sum = 0;
	cin >> n;
	int* p = new int[n];
	cin >> k;
	for (int i = 0; i < n; i++) {
		p[i] = k % 10;
		k = k / 10;
	}
	
	for (int i = 0; i < n; i++) {
		sum = sum + p[i];
	}
	cout << sum;
}

아스키 코드이용 안하고 한건데
적은 숫자는 되는데 큰 숫자로가면 오류가 난다. (질문 해야 함)

두번째 시도

#include <iostream>
using namespace std;


int main() {
	int n, sum = 0;
	cin >> n;
	string k;
	cin >> k;
	for (int i = 0; i < n; i++) {
		sum = sum + (int)k[i]-48;
	}
	cout << sum;
	
}
string k = abcdef
k[0] = a
k[1] = b
k[2] = c
k[3] = d
k[4] = e
k[5] = f

문자열 성질을 이용
아스키 코드를 이용하여 정답!


Silver 11719

첫시도

#include <iostream>
#include <string>
using namespace std;

int main() {
	string s;
	int cnt = 0;
	while(cnt!=100){
		cnt++;
		getline(cin, s);
		cout << s<<'\n';
	}
	return 0;
}

공백을 포함하므로 <string>의 getline()을 이용하여 입력을 받았고
cout << s<<'\n';에서 \n를 빼먹어서 애먹다가 풀었다

다른방법

#include <iostream>
#include <string>
using namespace std;

int main() {
	string s[100];
	
	for(int i=0;i<100;i++){
		getline(cin, s[i]);
	}
	for (int i = 0; i < 100; i++) {
		cout << s[i]<<'\n';
	}
	return 0;
}

질문

#include <iostream>
#include <string>
using namespace std;

int main() {
	string s;
	
	while (getline(cin, s)) {
		cout << s << '\n';
	}
	return 0;
}

이거 왜 되는지 모르겠음

Silver 2941(Croatia Alphabet)

첫시도

#include <iostream>
#include<string>
using namespace std;

int main() {
    int cnt = 0;
    string user;
    getline(cin, user);
    for (int i = 0; i < user.length(); i++) {
        cnt++;
        switch (user[i])
        {
        case 'c':if (user[i + 1] == '='|| user[i + 1] == '-') {
            i++;
        }
            break;


        case 'd':if (user[i + 1] == '-') {
            i++;
        }
                if (user[i + 1] == 'z'&&user[i+2]=='=') {
                    i = i + 2;
                }
            break;


        case 'l':if (user[i + 1] == 'j') {
            i++;
        }
            break;


        case 'n':if (user[i + 1] == 'j') {
            i++;
        }
            break;


        case 's':if (user[i + 1] == '=') {
            i++;
        }
            break;


        case 'z':if (user[i + 1] == '=') {
            i++;
        }
            break;


        default:
            break;
        }
    }

    cout << cnt;
    return 0;
}

두번째 시도

  1. 코드가 너무 길어서 중복되는 부분은 switch문의 특징을 이용하여 간단하게 만들었다
  2. user[i+1] user[i+2]에서 배열의 범위를 벗어나므로 범위를 추가해주었다.
#include <iostream>
using namespace std;

int main() {
    int cnt = 0;
    string user;
    cin >> user;
    for (int i = 0; i < user.length(); i++) {
        cnt++;
        switch (user[i])
        {
        case 'c':
        case 's':
        case 'z':
            if (i + 1 < 100) {
                if (user[i + 1] == '=' || user[i + 1] == '-') {
                    i++;
                }
            }
            break;

        case 'n':
        case 'l':if (i + 1 < 100) {
            if (user[i + 1] == 'j') {
                i++;
            }
        }
                break;

        case 'd':if (i + 1 < 100) {
            if (user[i + 1] == '-') {
                i++;
            }
        }
            if (i + 2 < 100) {
                if (user[i + 1] == 'z' && user[i + 2] == '=') {
                        i = i + 2;
                }
            }
                break;



        }
    }
        cout << cnt;
        return 0;
    
}

'틀렸습니다'가 나오는데 반례를 찾지 못하였다.

세번째 시도

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {
    string user;
    cin >> user;
    int idx;
   vector<string> croatia = { "c=","c-","dz=","d-","lj","nj","s=","z=" };

   for (int i = 0; i < croatia.size(); i++) {
       while (true)
       {
           idx = user.find(croatia[i]);
           if (idx == string::npos)break;
           user.replace(idx, croatia[i].length(), "#");
       }
   }
   cout << user.length();
        return 0;
    
}

두번째 시도의 반례를 찾지 못하여 벡터와 <string>의 내부함수인 find(), replace()를 사용하여 짧은 코드로 문제를 해결하였다. <string>의 내장함수를 이용하지 않으면 많이 길어지는 코드를 내장함수를 이용하여 비교적 간단하게 해결하였다 find(), replace()함수를 사용할 줄 아는지 물어보는 문제였다.

0개의 댓글