이 문제는 너무 쉬움.
쉽다고 뭐 공부 안할게 없다는 것은 아님.
나는 쉽다고 했지만 암시적 형변환 개념을 생각을 못하고 풀었음. (이건 푼게 아니다...)
풀었지만 왜 이렇게 풀었는지와 왜 이러한 방식을 썻고 다른방식이 있는지 생각을 해볼 필요가 있는듯?
나는 아스키 코드와 배열을 통해서 품.
#include <iostream>
using namespace std;
int arr[26];
int main()
{
string S;
cin >> S;
for (int i = 0; i < S.size(); ++i) arr[S[i] - 97]++;
for (int i : arr) cout << i << " ";
return 0;
}
카운트 문제를 풀 때는
std::map또는 array를 사용하도록 한다.
그러면 언제 map을 쓰고 arr을 사용을 하나?
stringdl 몇개냐? 할 경우 map이 조금 더 좋고
integer일 경우 arr이 조금 더 좋다.
근데 이문제는 "문자"를 카운팅 하는 문제임.
arr이라는 배열에 아스키 테이블 바인딩 되어있다고 가정을 하고 아래 코드를 보면은
char a = 'a';
arr[a]
// 출력결과
// arr[a] => 'a'
이게 가능한 이유는 암시적 형변환 때문이다.
강의에서는 그냥 "유연"하게 된다는데 이런거 다 알아야지 공부할려면 ㅇㅋ?
유연하게 되는게 아니라 암시적 형변환으로 가능한 것이다.
나는 아래처럼 97을 빼버렸는데 "암시적 형변환" 개념을 생각을 못했다..
그냥 이렇게 되지 않던가...? 정도로 넘어갔음..
#include <iostream>
using namespace std;
int arr[26];
int main()
{
string S;
cin >> S;
for (int i = 0; i < S.size(); ++i) arr[S[i] - 97]++;
for (int i : arr) cout << i << " ";
return 0;
}
이렇게 ㅈ밥티가 나는 식으로 상수를 빼버림 위에처럼 이런 코드가 아니라 아래처럼
밑줄친 부분에서 "암시적 형변환"이 일어나기 때문에 바로 접근이 가능하다.
대문자 A : 65, a : 97 정도는 외워 두자.