[BOJ_step_07] 문자열 04 ~ 06

2 분 소요

문자열

문자열을 다루는 문제들을 해결해 보자.

문자열 반복(2675)

2675

문제풀이

주어진 문자열에 대해서 각 문자를 r번 반복하여 출력하는 문제이다.

void solution_2675()
{
	char S[21];
	int t, r;
	scanf("%d ", &t);
	while (t--) {
		scanf("%d ", &r);
		scanf("%s", S);
		int i = 0;
		while (S[i]) {
			for (int j = 0; j < r; j++)	printf("%c", S[i]);
			i++;
		}
		printf("\n");
	}
}

단어공부(1157)

1157

문제풀이

이 문제는 대소문자를 구별하지 않으므로 26크기의 Alphabet 0~25a~z의 문자를 카운트해준다.
그리고 그 중 최빈값을 찾아주고 최빈값이 두 개 이상이면 ?를 출력하고 한 개라면 해당 문자를 출력해준다.

void solution_1157()
{
	int Alphabet[26];
	char S[1000001];
	int Max = 0, Cnt = 0;
	memset(Alphabet, 0, sizeof(Alphabet));
	scanf("%s", S);
	int a, i = 0;
	while (S[i]) {
		int n = S[i] >= 97 ? S[i] - 97 : S[i] - 65;
		Alphabet[n]++;
		i++;
	}
	for (int j = 0; j < 26; j++)
		if (Max < Alphabet[j])Max = Alphabet[j];
	for (int j = 0; j < 26; j++) {
		if (Alphabet != 0 && Max == Alphabet[j]) {
			Cnt++;
			if (Cnt > 1) {
				printf("?\n");
				return;
			}
			else if (Cnt == 1) a = j;
		}
	}
	printf("%c", a + 65);
}

단어의 개수(1152)

1152

문제풀이

이 문제는 여러가지 방법으로 풀어보았다.

scanfcin으로는 공백문자를 받을 수 없다. 따라서 fgets를 이용하여 공백문자를 포함한 문자열을 입력 받는다.
입력받은 문자열의 마지막 부분을 의미하는 \n이 될 때까지 a[len]을 아래 조건에 맞춰 탐색한다.

  • if(len>0 && a[len] == ' ') 첫 번째 문자가 아니고 그 문자가 공백문자cnt++

마지막 문자도 공백이라면 카운트하였으므로 마지막 문자가 공백일 때는 그대로 cnt를 출력하고 아니라면 cnt+1을 출력한다.

void solution_1152()
{
	const int MAX = 1000002;
	char a[MAX];
	fgets(a, MAX, stdin);
	int len = 0;
	int cnt = 0;
	while (1) {
		if (a[len] == '\n')break;
		if (len > 0 && a[len] == ' ') cnt++;
		len++;
	}
	if (a[len - 1] == ' ') printf("%d", cnt);
	else printf("%d", cnt + 1);
}  

getline()을 이용하여 공백을 포함한 문자열을 받고 특정문자(공백)이 나올때마다 잘라 string벡터에 담아 string벡터의 사이즈를 출력하는 방법이다.
이 방법을 split이라고 부른다. 하지만 해당 문제에 대해서는 시간 복잡도와 공간복잡도가 다른 방법에 비해 너무 크다.

void solution_1152(){
	string s;
	getline(cin, s);
	vector<string> v;
	string tmp;
	for (int i = 0; i < s.size(); i++) {
		if (i!=0&&s[i] == ' ') {
			v.push_back(tmp);
			tmp.clear();
		}
		else if(s[i]!=' ')tmp.push_back(s[i]);
	}
	if (tmp.size() > 0)v.push_back(tmp);
	cout << v.size() << endl;
}

split에서 착안하여 첫 번째 방법과 결합하여 조건을 만족하면 ans를 증가시키고 출력하는 방법이다.

void solution_1152(){
    int ans = 0;

	string s;
	getline(cin, s);
	for (int i = 0; i < s.size(); i++) {
		if (s[i] == ' ') {
			if (i != 0 && i != s.size() - 1)
				ans++;
		}
	}
	if (s.size() == 1 && s[0] == ' ') { cout << ans << endl; }
	else cout << ans + 1 << endl;
}

첫 번째 방법과 유사하다.

void solution_1152(){
    int ans = 0, len = 0;
	char s[1000002];
	fgets(s, 1000002, stdin);
	for (int i = 0; s[i] != '\n'; i++) {
		len++;
		if (i != 0 && s[i + 1] != '\n'&&s[i] == ' ')ans++;
	}
	if (len == 1 && s[0] == ' ') { cout << ans << endl; }
	else cout << ans + 1 << endl;
}

댓글남기기