[BOJ_step_07] 문자열 04 ~ 06
문자열
문자열을 다루는 문제들을 해결해 보자.
문자열 반복(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)
문제풀이
이 문제는 대소문자를 구별하지 않으므로 26크기의 Alphabet
0~25
에 a~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)
문제풀이
이 문제는 여러가지 방법으로 풀어보았다.
scanf
나 cin
으로는 공백문자
를 받을 수 없다. 따라서 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;
}
댓글남기기