문제 링크
난이도 : 브론즈 4

문제 내용

알파벳 소문자로만 이루어진 단어 S가 주어진다. 각 알파벳이 단어에 몇 개가 포함되어 있는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.

출력

단어에 포함되어 있는 a의 개수, b의 개수, …, z의 개수를 공백으로 구분해서 출력한다.

문제 분석

  1. 알파벳은 총 26글자니까 크기 26만큼의 int 배열을 만듬
  2. 단어 s 받고 한 글자 - ‘a’ 번째의 수를 1씩 늘림

작성한 코드

// 250124
#include <iostream>
using namespace std;
 
int main () {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    int alphas[26] = {0,};
    char S[100];
 
    cin.getline(S, 100);
 
    for(char oneChar : S) {
        if (oneChar == '\\0') break;
        if (oneChar == ' ') continue;
        int intChar = oneChar - 'a';
        // cout << "One Char : " << oneChar << " | int Char : " << intChar << "\\n";
        alphas[intChar] += 1;
    }
 
    for(auto alphaCount : alphas) {
        cout << alphaCount << " ";
    }
}

이렇게 했는데 안됨.. 다른 코드 분석해보면서 이유 찾고자 함

참고자료 :

[BOJ] 백준 10808번 : 알파벳 개수 C++ : 아주정은

Char 100만큼 미리 선언해두고 하다보니까 이상하게 꼬인 듯.

터미널에서는 분명 문제없이 나왔는데..

라이브러리 안쓰려는 이상한 습관때매 시간만 더 걸렸다… 그냥 쓸때는 과감하게 써야지

아래는 수정 후 코드

// 250124
#include <iostream>
#include <string>
using namespace std;
 
int main () {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    int alphas[26] = {0,};
    string S;
 
    cin >> S;
 
    for(int i = 0 ; i < S.length(); i++) {
        alphas[(int)(S[i] - 'a')] += 1;
    }
 
    for(auto alphaCount : alphas) {
        cout << alphaCount << " ";
    }
}

우수 코드 분석

#import<cstdio>
int c,a[26];
main(){
while(~scanf("%c",&c))a[c-97]++;for(auto k:a)printf("%d ",k);
}

While문을 사용해서 int c에 문자를 하나씩 받아옴 (애초에 char로 안받고 바로 정수로 받음)

그리고 거기서 아스키코드 a의 수인 97을 빼서 배열에 더함

While(~scanf(“%c”, &c))