https://www.acmicpc.net/problem/10808
문자열을 입력받고 해당 문자열에 포함되어있는 a의 개수,b의 개수,...z의 개수를 공백으로 구분해서 출력하는 문제다.
c++의 실행속도를 믿고 일단 무식하게 코드를 짜서 제출해봤는데 역시나 c++..정답처리되었다.😎
#include <iostream>
#include <algorithm>
#include<string>
using namespace std;
int a[26] = { 0, };
int main() {
string s;
cin >> s;
for (int i = 0; i < s.length(); i++) {
if (s[i] == 'a') a[0] += 1;
if (s[i] == 'b') a[1] += 1;
. . . 생략 . . .
if (s[i] == 'z') a[25] += 1;
}
for (int i = 0; i < 26; i++) {
cout << a[i] << " ";
}
}
하지만 좀 더 똑똑하고 효율적으로 다시 코드를 짜보도록 하자.
#include <iostream>
#include <algorithm>
#include<string>
using namespace std;
int cnt[26] = { 0, };
int main() {
string s;
cin >> s;
for (char a : s) { //s안에 있는 문자 a들을 순회할거라는 뜻
cnt[a - 'a']++;
}
for (int i : cnt) {
cout << i << " ";
}
}
범위 기반 for문을 이용하여 풀었다. (그냥 for문이랑 코드 길이가 짧다는 것 외에 기능 상 차이는 없다.)
for (char a : s) {
cnt[a - 'a']++;
}
입력받은 문자열 s를 하나하나 뜯어볼건데 그 하나~하나~는 char a로 칭한다.
소문자는 아스키 코드를 가지기 때문에 arr[a] = arr[97]이고 arr[b] = arr[98] ... arr[z]=arr[123]이다.
알파벳 각각 개수를 저장하는 배열 cnt의 크기를 123으로 해서 cnt[a]++ 라고 할 수 있지만, 공간 낭비를 줄이기 위해 cnt[a-'a']++ 로 배열 index가 0~26을 갖도록 했다.
for (int i : cnt) {
cout << i << " ";
}
cnt안에 있는 원소들을 공백으로 구분하여 출력하면 끝!