https://www.acmicpc.net/problem/10808
#include<bits/stdc++.h>
using namespace std;
int cnt[26];
int main() {
string alp = "abcdefghijklmnopqrstuvwxyz";
string S;
cin >> S;
for (int i = 0; i < S.length(); i++)
for (int j = 0; j < 26; j++)
if(S[i] == alp[j])
cnt[j]++;
for (int i : cnt)
cout << i << " ";
return 0;
}
➡️ 코드가 너무 복잡하고 무겁다. 꼭 중첩 for문 사용하지 않아도 될 것 같은데.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string str;
int cnt[26];
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> str;
for(char a : str){
cnt[a - 'a']++;
}
for(int i = 0; i < 26; i++) cout << cnt[i] << " ";
return 0;
}
a~z : 아스키코드 97~122
코드처럼 a-'a'
하면 97-97(0) ~ 122-97(25) 범위
대문자 A는 65, 소문자 a는 97
이것만 외워두기.
되게 간단하네. 복잡도도 개선되고
CountingStar는 맵 또는 배열
Count 할 경우에 맵이나 배열을 쓰는 게 좋다.
Map은 key, Value 형태로 이뤄져있다. a는 몇 개, 이런 식으로 카운팅.
String이 몇 개인지를 셀 때는 Map, int를 셀 때는 Array가 좋다.
(10만, 100만, 1000만 이런 식으로 띄엄띄엄 input이 들어올 땐 Map을 쓰는 게 좋다.)이 문자는 문자열을 기반으로 '문자'를 카운팅하기 때문에 Array를 쓴다.
배열을 지역변수로 선언 후, 초기화 하지 않고 코드를 실행했는데 값이 이상하게 나왔다.(쓰레기값이 들어감)
전역으로 할당할 경우 자동으로 모든 값이 0으로 초기화가 된다.
특별한 초기화 값이 없으면 0으로 초기화 된다.
프로그램이 시작할 때 만들어졌다가 프로그램이 종료될 때 함께 사라진다.
지역변수로 선언하면 스택에 생성되어 스택의 크기 제한에 따라 런타임에러가 생기지반 전역변수로 선언하면 힙 영역에 생성되어 그 제한으로부터 자유롭다.